¿Cómo implementar la cláusula "IN" con Dapper Extensions Predicate?

c# dapper dapper-extensions

Pregunta

Quiero reemplazar esta consulta usando Dapper Extensions Predicate?

SELECT * 
FROM SomeTable 
WHERE id IN (commaSeparatedListOfIDs)

El commaSeparatedListOfIDs es un IEnumerable de Integer .

Lo que he intentado hasta ahora:

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();
}

Necesito un operador Operator.In , pero no existe en Dapper Extensions.

¿Cómo debería implementar la cláusula "IN" con el sistema Dapper Extensions Predicate?

Respuesta popular

Solución 1:

Usar PredicateGroup con GroupOperator.Or es una solución.

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);

Por favor, consulte este enlace.

Solución 2:

Como mencionaste en tu respuesta y en este enlace, usar FieldPredicate ( Predicates.Field ) con Operator.Eq y pasar el parámetro IEnumerable deberían hacer lo mismo.

var predicate = Predicates.Field<SomeTable>(f => f.Id, Operator.Eq, commaSeparatedListOfIDs);

Aquí Eq debe traducirse internamente a la cláusula IN según este código fuente de Dapper Extensions en GitHub.

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);
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué