解决方案一:
Using PredicateGroup
with 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 https://github.com/tmsmith/Dapper-Extensions/issues/109 and this https://github.com/tmsmith/Dapper-Extensions/wiki/Predicates#multiple-compound-predicates-predicate-group link.
解决方案2:
正如您在回答中提到的this https://github.com/tmsmith/Dapper-Extensions/issues/164链接,使用 FieldPredicate (Predicates.Field
) with Operator.Eq
,并通过IEnumerable
参数应该做同样的事情。
var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.Eq, commaSeparatedListOfIDs);
Here Eq
应内部翻译为IN条款按照this https://github.com/tmsmith/Dapper-Extensions/blob/dd82ecc6f710bca6d5e5645cbff8da97e411257f/DapperExtensions/Predicates.cs#L203GitHub 上 Dapper Extensions 的源代码。
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);
}
要转动IN
如上所述的条款NOT IN
子句,使用最后一个bool not
范围。请参阅this https://stackoverflow.com/a/63831728/5779732回答更多详细信息。
示例代码如下:
var predicate = Predicates.Field<Customer>(f => f.CustomerID, Operator.Eq, commaSeparatedListOfIDs, true);