EF 表达式中的多个“Or”语句
本文关键字:Or 语句 表达式 EF | 更新日期: 2023-09-27 18:31:39
给定以下形式的过滤器参数列表:
public class filterParm
{
public int age { get; set; }
public string name { get; set; }
}
哪里:
var parms = new List<filterParm>
{
new filterParm {age = 22, "phil"},
new filterParm {age = 19, "dave"},
new filterParm {age = 31, "nick"}
};
我如何编写一个表达式,该表达式将导致以下 SQL where 子句(请注意粗体的 OR 运算符:
其中(年龄 = 22 且姓名 = "phil")
OR (年龄 = 19 岁,姓名 = "Dave")OR (年龄 = 31 且姓名 = "昵称")
我当前的实现导致每个语句由 AND 运算符分隔
:private _dbSet<user> Users { get; set; }
public List<user> CustomFilter(List<filterParm> parms)
{
IQueryable<TEntity> query = _dbSet;
if (parms.Count > 0 )
{
foreach (var parm in parms)
{
query = query.Where(u => u.Age == parm.Age && u.Name == parm.Name);
}
}
return query.ToList();
}
上面的代码生成以下 SQL:
其中(年龄 = 22 和姓名 = "phil")和(年龄 = 19 AND name = "dave") AND (age = 31 AND name = "nick")
我需要在表达式中更改什么才能使生成的 SQL 在指定的位置使用"OR"而不是"AND"? 我宁愿尽可能避免使用第三方库。
编辑:正如 @KingKing 所建议的,union
确实返回所需的结果:
private _dbSet<user> Users { get; set; }
public List<user> CustomFilter(List<filterParm> parms)
{
IQueryable<TEntity> query = _dbSet;
if (parms.Count > 0)
{
query = query.Where(u => u.Age == parms[0].Age && u.Name == parms[0].Name);
for (int i = 1; i < parms.Count; i++)
{
var parm = parms[i];
query = query.Union(DbSet.Where(u => u.Age == parm.Age && u.Name == parm.Name));
}
}
return query.ToList();
}
我仍然想知道是否可以使用"Or"运算符生成语句,如前所述。
我认为使用Union
会有所帮助:
public List<user> CustomFilter(List<filterParm> parms) {
IQueryable<TEntity> query = _dbSet;
if (parms.Count > 0 ){
IQueryable<TEntity> init = _dbSet;
var firstParm = parms[0];
query = query.Where(u => u.Age == firstParm.Age && u.Name == firstParm.Name);
for(int i = 1; i < parms.Count; i++)
{
var nextParm = parms[i];
init = init.Where(u => u.Age == nextParm.Age && u.Name == nextParm.Name);
query = query.Union(init);
}
}
return query.ToList();
}