2012-03-12 80 views
0

我有简单的LINQ语句(使用EF4)的LINQ与逻辑

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 (即一个用于所有3个,一个valyes的每个排列单独的LINQ语句,如果只carname有一个值,一个是如果carname和CarIdNumber有价值等等)

但必须有更聪明的方式

谢谢!

+0

我听不太懂什么是“跨越一个或查询更多的三个字段,如果他们有价值“意味着 – Stilgar 2012-03-12 09:46:28

+0

注意:我不想使用LIKe语句,因为如果它是一个未索引的搜索。编号而不是测试一个空的变量是否更明智 – Crudler 2012-03-12 09:47:01

回答

1

如果“没有值”意味着空,那么你可以使用空合并运算符??说如果采取填充的第一个值,否则取二:

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

请在发布之前检查格式预览。 – 2012-03-12 10:05:22

+1

@Anders Abel:我正在通过电话发帖,但没有预览!我回去修复它,但你已经完成了它 – kaj 2012-03-12 10:06:44

+0

谢谢我喜欢这个主意,但似乎没有工作。也许是因为我的价值是“”而不是零。这可能是我的问题吗? – Crudler 2012-03-12 10:50:16

0

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

1

对于性能(处理数据库查询时),有时可以让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; 
} 
+0

我认为如果你使用方法语法,你的代码会更短。 – svick 2012-03-12 10:31:12

+0

@svick:是的,这将是更少的线条,但谁在乎线条; - )\ – Steven 2012-03-12 10:33:17

+0

这也将是更少的代码。我认为不必通读所有'from'和'select'就可以使代码更具可读性。 – svick 2012-03-12 10:38:52