从阵列比较的地方

时间:2018-02-05 01:17:32

标签: c# sql entity-framework linq

我有一个具有以下结构的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()函数不接受连接的字符串。

1 个答案:

答案 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参数。