У меня есть простой оператор 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 имеет значение и т. Д.)
Но должен быть более умный способ
Благодарность!
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)
Для повышения производительности (при работе с запросами к базе данных) иногда может быть полезно разрешить 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;
}
where (inputCar.CarName != null || d.CarName == inputCar.CarName) &&...
Похожие вопросы
Новые вопросы
linq
Language Integrated Query (LINQ) - это компонент Microsoft .NET Framework, который добавляет собственные возможности запроса данных в языки .NET. При необходимости рассмотрите возможность использования более подробных тегов, например [linq-to-sql], [linq-to-entity] / [entity-framework] или [plinq]