Линк с логикой - PullRequest
       5

Линк с логикой

0 голосов
/ 12 марта 2012

У меня есть простой оператор 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);

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

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

но должен быть разумнее

Спасибо!

Ответы [ 3 ]

1 голос
/ 12 марта 2012

Для производительности (при работе с запросами к базе данных) иногда может быть полезно позволить 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 голос
/ 12 марта 2012

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

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)
0 голосов
/ 12 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...