У меня есть простой оператор Linq (с использованием EF4)

var efCars = (from d in myentity.Cars
         where d.CarName == inputCar.CarName
         && d.CarIdNumber == inputCar.IdNumber
         && d.Make == inputCar.Make
         select d.Car);

Я хочу, чтобы он был умнее, чтобы он запрашивал только одно или несколько из 3 полей, ЕСЛИ у них есть значения.

Я могу провести тест раньше, а затем иметь отдельный оператор linq для каждой перестановки значений для inputcar (т.е. один для всех 3, один для, если только carname имеет значение, один для, если carname И CarIdNumber имеет значение и т. Д.)

Но должен быть более умный способ

Благодарность!

0
Crudler 12 Мар 2012 в 13:42

3 ответа

Лучший ответ

Если "не имеет значения" означает null, вы можете использовать оператор объединения null ?? сказать, взять первое значение, если оно заполнено, иначе взять второе:

var efCars = (from d in myentity.Cars
where d.CarName == (inputCar.CarName ?? d.CarName
&& d.CarIdNumber == (inputCar.IdNumber && d.CarIdNumber)
&& d.Make == (inputCar.Make && d.Make)  
select d.Car);

Это в основном говорит о том, что если значение существует, оно должно совпадать, в противном случае рассматривать его как совпадение

Однако, если вместо этого вы говорите «когда специальное значение (пустая строка) игнорирует его, в противном случае соответствует», вы можете использовать один из двух подходов (или, возможно, больше!):

where (inputCar.CarName == "" || d.CarName == inputCar.CarName)  

where (string.IsNullOrEmpty(inputCar.CarName) || d.CarName == inputCar.CarName)
1
kaj 12 Мар 2012 в 11:05

Для повышения производительности (при работе с запросами к базе данных) иногда может быть полезно разрешить EF генерировать запросы на основе фильтров вместо использования одного универсального запроса. Конечно, вам нужно будет определить, помогает ли это вам в этом случае (никогда не оптимизируйте преждевременно), но вот как это будет выглядеть, если вы динамически создаете свой запрос:

var efCars =
    from car in myentity.Cars
    select car;

if (inputCar.CarName != null)
{
    efCars =
        from car in efCars
        where care.CarName == inputCar.CarName
        select car;
}

if (inputCar.IdNumber != null)
{
    efCars =
        from car in efCars
        where care.CarIdNumber == inputCar.IdNumber
        select car;
}

if (inputCar.Make != null)
{
    efCars =
        from car in efCars
        where care.Make == inputCar.Make
        select car;
}
1
Steven 12 Мар 2012 в 10:29

where (inputCar.CarName != null || d.CarName == inputCar.CarName) &&...

0
Fabian Nicollier 12 Мар 2012 в 10:08