我想使用Dapper扩展谓词替换此查询吗?

SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)


commaSeparatedListOfIDsIEnumerableInteger

到目前为止我尝试过的是:

using (SqlConnection cn = new SqlConnection(_connectionString))
{
    cn.Open();
    var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.???, commaSeparatedListOfIDs);
    IEnumerable<SomeTable> list = cn.GetList<SomeTable>(predicate);
    cn.Close();
}


我需要一个运算符Operator.In,但Dapper Extensions中不存在该运算符。

如何在Dapper Extensions谓词系统中实现“ IN”子句?

最佳答案

解决方案1:

PredicateGroupGroupOperator.Or一起使用是一种解决方案。

var predicateGroup = new PredicateGroup { Operator = GroupOperator.Or, Predicates = new List<IPredicate>() };
foreach(int thisID in commaSeparatedListOfIDs)
{
    var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.Eq, thisID);
    predicateGroup.Predicates.Add(predicate);
}
IEnumerable<SomeTable> list = cn.GetList<SomeTable>(predicateGroup);


请参考this链接。

解决方案2:

正如您在答案和this链接中提到的那样,将FieldPredicate(Predicates.Field)与Operator.Eq一起使用,并传递IEnumerable参数应该可以做到这一点。

var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.Eq, commaSeparatedListOfIDs);


根据GitHub上Dapper Extensions的this源代码,此处Eq应该在内部转换为IN子句。

if(Value is IEnumerable && !(Value is string))
{
    if(Operator != Operator.Eq)
    {
        throw new ArgumentException("Operator must be set to Eq for Enumerable types");
    }

    List<string> @params = new List<string>();
    foreach(var value in (IEnumerable)Value)
    {
        string valueParameterName = parameters.SetParameterName(this.PropertyName, value, sqlGenerator.Configuration.Dialect.ParameterPrefix);
        @params.Add(valueParameterName);
    }

    string paramStrings = @params.Aggregate(new StringBuilder(), (sb, s) => sb.Append((sb.Length != 0 ? ", " : string.Empty) + s), sb => sb.ToString());
    return string.Format("({0} {1}IN ({2}))", columnName, Not ? "NOT " : string.Empty, paramStrings);
}

关于c# - 如何使用Dapper Extensions谓词实现“IN”子句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49777139/

10-10 13:59
查看更多