我有一个带有以下结构的SQL表:
id ------- | ------- attr1 ------- | ------- | ------- attr2 ------- | ------- attr3------- |
1 -------- | -------- true -------- | -------错误------- | ----------------------------------------false ------- |
2 -------- | -------- true ------- | ------- true --------- | ---- | --------- true ------- |
,依此类推,依此类推。
我正在尝试构建一个可以在已知的true/false组合中拉出正确ID的LINQ查询。
。例如,我可以使用以下内容:
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列属性列正确地使其成为动态函数,并且我可以输入一个带有任意数量元素的数组来进行比较(例如,第一次atter1和attr2,然后attr3和attr4和attr5下一个(。
是否有有效的方法可以做到这一点?我最大的问题是.firstordefault((函数不接受串联字符串。
您应该动态创建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
(默认行为(,而是从Attr3
进行比较 应该通过3作为start
参数。