2011-11-21 48 views
1

我有两个查询用于过滤数据列表。主要部分每次都运行,并且在正常情况下应该将结果总数降至最多十二个。当我编辑Foo对象而不是创建新对象时,我还想从我正在处理的一组数据中删除保存在数据库中的副本。有条件的LINQ查询可以组合成每次都运行的查询吗?

我目前正在使用if语句和第二个查询去除它。有没有办法将条件和第二个查询合并到第一个查询中?

IEnumerable<Foo> myFoos = bar.GetFoos() 
    .Where(f => f.Value1 == value1 && f.Value2 == value2); 


if (editFoo != null) 
    myFoos = myFoos.Where(f => f.ID != editFoo.ID); 

当我试图通过sehe或丹·西弗提出的疑问,并呼吁myFoos.ToList()我得到一个异常:

Unable to create a constant value of type 'Foo'. Only primitive types ('such as Int32, String, and Guid') are supported in this context 

我创建了一个包含在我未被改写的查询每个属性的虚拟对象并且它没有错误地运行,所以我倾向于怀疑问题是实体框架不理解建议查询中的空检查,并且正在对它们进行检查。 实体框架是责任;没有它,任何解决方案都会按照书面形式工作

回答

3

布尔逻辑的救援。

IEnumerable<Foo> myFoos = bar.GetFoos() 
    .Where(f => 
     (f.Value1 == value1) && 
     (f.Value2 == value2) && 
     ((editFoo == null) || (f.ID != editFoo.ID))); 

,使得它的工作的事情是shortcut evaluation

+1

它不应该是:'(editFoo == NULL)|| (f.ID!= editFoo.ID)'? –

+0

@DanSeaver:糟糕的经典错误。固定 – sehe

+0

看起来应该已经工作了,但我得到了异常:无法创建一个'Foo'类型的常量值。在此上下文中仅支持基本类型(如Int32,String和Guid)。 –

1

你可以这样做:

IEnumerable<Foo> myFoos = bar.GetFoos() 
    .Where(f => f.Value1 == value1 && 
      f.Value2 == value2 && 
      ((editFoo != null) ? (f.ID != editFoo.ID) : true)); 
+0

我试过你的版本,但我得到了与sehe的。 –