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