如何在 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 {...});
流畅语法的一个主要好处是它简化了查询组合。
你可以自由地混合表达和流利的语法。
这是我的 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 {...});
流畅语法的一个主要好处是它简化了查询组合。
你可以自由地混合表达和流利的语法。