Dan*_*tti 2 c# dapper dapper-extensions
我想使用 Dapper Extensions Predicate 替换此查询?
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
Run Code Online (Sandbox Code Playgroud)
这commaSeparatedListOfIDs是IEnumerable一个Integer。
到目前为止我已经尝试过:
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();
}
Run Code Online (Sandbox Code Playgroud)
我需要一个操作符Operator.In,但它在 Dapper Extensions 中不存在。
我应该如何使用 Dapper Extensions Predicate 系统实现“IN”子句?
解决方案一:
使用PredicateGroupwithGroupOperator.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);
Run Code Online (Sandbox Code Playgroud)
解决方案2:
正如您在答案和此链接中提到的,使用 FieldPredicate ( Predicates.Field) 和Operator.Eq, 并传递IEnumerable参数应该执行相同的操作。
var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.Eq, commaSeparatedListOfIDs);
Run Code Online (Sandbox Code Playgroud)
这里Eq应该根据GitHub 上 Dapper Extensions 的源代码在内部翻译为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);
}
Run Code Online (Sandbox Code Playgroud)
要将IN上述子句转换为NOT IN子句,请使用最后一个bool not参数。请参阅此答案以了解更多详细信息。
示例代码如下:
var predicate = Predicates.Field<Customer>(f => f.CustomerID, Operator.Eq, commaSeparatedListOfIDs, true);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4045 次 |
| 最近记录: |