次の形式のフィルター パラメーターのリストが与えられます。
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 名前 = "フィル")
OR (年齢 = 19 AND 名前 = "デイブ")
OR (年齢 = 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 (年齢 = 22 AND 名前 = "フィル") AND (年齢 = 19 AND 名前 = "デイブ") AND (年齢 = 31 AND 名前 = "ニック")
生成された SQL が指定された場所で「AND」ではなく「OR」を使用するようにするには、式で何を変更する必要がありますか? 可能であれば、サードパーティのライブラリの使用は避けたいと思います。
編集: @KingKing で提案されているように、 aunion
は必要な結果を返します。
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」演算子を使用してステートメントを生成できるかどうかを知りたいです。