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



这是我LINQ查询,需要更新为动态where子句。 如果参数的id值为 0,则 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 子句?

我将使用 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 {...});

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

您可以自由地混合表达和流畅的语法。

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以完全消除该条件。

最新更新