如何编写匹配多个批量输入的 LINQ 表达式?
这是我的数据库表
Members
Division, Department
1 3
4 9 *
5 1
6 3 *
9 2
我想选择标有 * 的成员
这是我的输入
int[] divisions = new int[2] {4, 6};
int[] department = new int[2] {9, 3};
这是我尝试过的查询
var selectedMembers = members.Where(member => divisions.Contains(member.Division) && department.Contains(member.Department)).ToArray();
这在 EF 中行为不正确。它适用于单个输入但不适用于两个输入(部门和部门)
它应该返回输入中匹配的对
例如:
Member[] selectedMembers = new Member[2] { new Member{Division=4,Department=9}, new Member{Division=6,Department=3}};
EF 不直接支持此类过滤。
一种可能的解决方案是动态构建一个谓词,如下所示:
member => (member.Division == divisions[0] && member.Department == departments[0])
|| (member.Division == divisions[1] && member.Department == departments[1])
...
|| (member.Division == divisions[N-1] && member.Department == departments[N-1]);
您可以按照以下方法执行此操作:
var parameter = Expression.Parameter(typeof(Member), "member");
var predicate = Expression.Lambda<Func<Member, bool>>(
Enumerable.Range(0, divisions.Length)
.Select(i => new Expression[]
{
Expression.Equal(Expression.Property(parameter, "Division"), Expression.Constant(divisions[i])),
Expression.Equal(Expression.Property(parameter, "Department"), Expression.Constant(departments[i])),
}
.Aggregate(Expression.AndAlso))
.Aggregate(Expression.OrElse),
parameter);
var query = members.Where(predicate);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)