可以将条件LINQ查询合并为每次都运行的查询吗?

本文关键字:查询 运行 条件 LINQ 合并 | 更新日期: 2023-09-27 18:15:16

我有两个查询用于过滤数据列表。主要部分每次都运行,在正常情况下应该将结果总数减少到最多十二个或两个。当我编辑一个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);

当我尝试由她或丹西弗建议的查询,并调用.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

我创建了虚拟对象,其中包含我未修改的查询中的每个属性,并且它没有错误地运行,所以我倾向于怀疑问题是实体框架不理解提议查询中的空检查,并且正在对它们进行呕吐。实体框架是罪魁祸首;

可以将条件LINQ查询合并为每次都运行的查询吗?

布尔逻辑来拯救。

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

让它工作的是快捷求值

你可以这样做:

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