我有一个简单的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个字段中的一个或多个字段中查询,如果它们有值。
我可以在之前做一个测试,然后为inputcar的每个value排列创建一个单独的linq语句(例如,一个用于所有3,一个用于如果只有carname有值,一个用于如果carname和CarIdNumber有值,等等)
但一定有更聪明的方法
谢谢!
发布于 2012-03-12 18:01:28
如果"has no value“表示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)发布于 2012-03-12 18:29:31
为了提高性能(在处理数据库查询时),让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;
}发布于 2012-03-12 18:08:32
where (inputCar.CarName != null || d.CarName == inputCar.CarName) &&...
https://stackoverflow.com/questions/9664698
复制相似问题