阵列比较的地方



我有一个带有以下结构的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参数。

最新更新