Ich möchte diese Abfrage mit Dapper Extensions Prädikat ersetzen?
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
Die commaSeparatedListOfIDs
ist ein IEnumerable
von Integer
.
Was ich bisher versucht habe:
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();
}
Ich brauche einen Operator Operator.In
, aber es existiert nicht in Dapper Extensions.
Wie sollte ich die "IN" -Klausel mit dem Dapper Extension Prädikat-System implementieren?
Lösung 1:
Die Verwendung von PredicateGroup
mit GroupOperator.Or
ist eine Lösung.
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);
Bitte beziehen Sie sich auf diesen Link.
Lösung 2:
Wie Sie in Ihrer Antwort und diesem Link erwähnt haben, sollte die Verwendung von FieldPredicate ( Predicates.Field
) mit Operator.Eq
und das Übergeben des IEnumerable
Parameters dasselbe tun.
var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.Eq, commaSeparatedListOfIDs);
Hier sollte Eq
wie in diesem Quellcode von Dapper Extensions auf GitHub intern in die IN- Klausel übersetzt werden.
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);
}