我有一个具有以下结构的SQL表:
标识------- | ------- ------- ATTR1 | ------- ------ ATTR2 | ------ Attr3 ------ |
1 -------- | --------真------- | ------ -------假| ----- -false ------ |
2 -------- | --------真------- | ------ --------真| ---- --- -------真|
依此类推,使用不同的真/假组合。
我正在尝试构建一个Linq查询,该查询可以在给定已知的true / false组合的情况下提取正确的Id。
例如,我可以使用以下内容:
public int GetTypeId(string[] arr)
{
//arr[0] is true, arr[1] is false
return _context.Types
.FirstOrDefault(x => x.Attr1 == arr[0] && x.Attr2 ==arr[1]).Id;
}
这会产生1的Id。
现在我的问题是如何正确地使这个动态函数有10个属性列,我可以输入一个具有任意数量元素的数组来进行比较(比如Attr1和Attr2第一次,然后是Attr3)和下一个Attr4和Attr5)。
有一种有效的方法吗?我最大的问题是.FirstOrDefault()函数不接受连接的字符串。
答案 0 :(得分:2)
您应该动态创建break
Expression
:
predicate
如果您想从
public int GetTypeId(string[] arr, int start = 1) { var arg = Expression.Parameter(typeof(TypeClass), "x"); Expression andExpr = null; for(var i = 0; i < arr.Length; i++) { var exprProp = Expression.Property(arg, "Attr" + (i + start)); var exprVal = Expression.Constant(arr[i]); var exprEq = Expression.Equal(exprProp, exprVal); andExpr = andExpr == null ? exprEq : Expression.AndAlso(andExpr, exprEq); } var predicate = Expression.Lambda<Func<TypeClass, bool>>(andExpr, arg); return _context.Types.FirstOrDefault(predicate).Id; }
(默认行为)开始比较,而不是从Attr1
开始比较 应该传递3作为Attr3
参数。