可以将条件LINQ查询组合成每次运行的查询吗?

时间:2011-11-21 20:51:02

标签: c# linq entity-framework

我有两个查询用于过滤数据列表。主要部分每次运行,在正常情况下应将结果总数减少到最多十二个或两个。当我正在编辑Foo对象而不是创建新对象时,我还想从我正在处理的数据集中删除DB中保存的副本。

我目前正在使用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或Dan Seaver建议的查询,并在.ToList()上致电myFoos时,我得到例外:

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

我创建了一个虚拟对象,其中包含我的unmunged查询中的每个属性,它运行没有错误,所以我倾向于怀疑问题是实体框架不理解建议的查询中的空检查,并且对他们进行殴打实体框架应该受到指责;没有它,任何解决方案都可以按照书面形式工作。

2 个答案:

答案 0 :(得分:3)

救援的布尔逻辑。

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

让它发挥作用的是shortcut evaluation

答案 1 :(得分:1)

您可以执行以下操作:

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