如何使用Dapper Extensions Predicate实现“IN”子句?

时间:2018-04-11 14:00:37

标签: c# dapper dapper-extensions

我想使用Dapper Extensions Predicate替换此查询?

companyid: 1,
companyabbr: "ABC",
companyname: "Alpha Beta Company",
flags: [
  {
    flagID: 1,
    flagName: "Flag 1"
  }
],
companyid: 1,
companyabbr: "ABC",
companyname: "Alpha Beta Company",
flags: [
  {
    flagID: 2,
    flagName: "Flag 2"
  }
]

SELECT * FROM SomeTable WHERE id IN (commaSeparatedListOfIDs) commaSeparatedListOfIDs的{​​{1}}。

到目前为止我尝试过:

IEnumerable

我需要一个运算符Integer,但它在Dapper Extensions中不存在。

如何使用Dapper Extensions Predicate系统实现“IN”子句?

2 个答案:

答案 0 :(得分:1)

解决方案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链接中提到的那样,使用Field {/ {1}}的FieldPredicate(Predicates.Field),并传递Operator.Eq参数也应该这样做。

IEnumerable

此处var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.Eq, commaSeparatedListOfIDs); 应根据GitHub上Dapper Extensions的this源代码在内部翻译为 IN 子句。

Eq

答案 1 :(得分:0)

基于此链接Github Issue

  

如果你使用FieldPredicate,设置为Equal并传入一个数组,它将转换为IN。

所以,正确的方法就是这样。

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