如何在 LINQ 中动态添加或删除 where 子句

How to dynamically add or remove where clause in LINQ

这是我的 LINQ 查询,需要更新为动态 where 子句。 如果参数的 id 值为 0,则 where 子句应 return 所有记录,否则 where 子句应根据 id 值匹配记录。

public async Task<IEnumerable<dynamic>> GetFilteredRowsByID(int id)
        {
            return from m in _context.TableName
                   where m.id == (id != 0 ? id : /*AllRecordsHere*/ )
                   join ...
                   join ...
                   select new {...}
        }

我用Asp.Net Core 2.2。是否可以不为此编写另一个没有 where 子句的方法?

id != 0 ? 移到等号表达式之外:

public async Task<IEnumerable<dynamic>> GetFilteredRowsByID(int id)
{
    return from m in _context.TableName
           where id != 0 ? m.id == id : true
           join ...
           join ...
           select new {...}
}

希望 EF 能够优化 where true 以完全消除这种情况。

我将使用 AsQueryable 惰性查询而不是一个 LINQ 查询来完成它。因为我认为它更具可读性。


    var query = (from m in _context.TableName.AsQueryable() select m );
    if(id != 0)
        query = query.Where(w=>w.id == id);
    query = ( from m in query
        join ...
        join ...
        select new {..}
    )

试用条件:

where id == 0 || m.id == id

如果 id == 0,整个表达式的计算结果为 true,否则为假,将检查第二个条件 m.id == id

我不确定您是否可以使用 100% 的表达式语法完全实现此目的,但您可以使用流畅的语法:

var result = _context.TableName;
if (id != 0) result = result.Where(m => m.Id == id);
result = result.Join(...).Join(...).Select(m => m.new {...});

流畅语法的一个主要好处是它简化了查询组合。

你可以自由地混合表达和流利的语法。