我想使用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”子句?
答案 0 :(得分:1)
解决方案1:
将PredicateGroup
与GroupOperator.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();
}