【发布时间】:2013-09-17 09:31:38
【问题描述】:
给定一个过滤器参数列表,格式为:
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 运算符:
WHERE(年龄 = 22 AND 姓名 = “phil”)
或(年龄 = 19 AND 姓名 = “dave”)
或(年龄 = 31 AND 姓名 = “昵称”)
我当前的实现导致由 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:
WHERE (age = 22 AND name = "phil") AND (age = 19 AND name = "dave") AND (年龄 = 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' 运算符生成语句。
【问题讨论】:
-
你最好看看这个答案:stackoverflow.com/questions/1775050/…
-
@jyparask 看起来LinqKit 和PredicateBuilder 对我有用。但是,如果可能的话,我仍然想知道如何在不使用第三方库的情况下实施解决方案。
标签: c# entity-framework-4 odac