Colecciones dinámicas de Dynamic Lin en Dapper - ¿posible?

c# dapper linq

Pregunta

Estamos investigando el uso de LinQ para consultar una colección dinámica interna creada por Dapper. La pregunta es:

¿Cómo se puede ejecutar LinQ dinámico contra la colección usando el dynamic LINQ de Scott Guthrie (o alguna otra tecnología si es posible)? ( http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library )

Esto es lo que queremos hacer (mucho más simplificado):

Utilice Dapper para devolver una colección dinámica (aquí llamada filas):

rows = conn.Query(“select ACCOUNT, UNIT, AMOUNT from myTable”);

Si usamos una consulta LinQ "estática" no hay problema. Así que esto funciona bien:

var result = rows.Where(w => w.AMOUNT > 0);

Pero nos gustaría escribir algo similar a esto usando Linq dinámico:

var result = rows.Where("AMOUNT > 0");

Pero no podemos hacer que esto funcione.

El error que obtenemos es:

No existe propiedad o campo 'AMOUNT' en el tipo 'Objeto'

(Hemos probado muchas otras sintaxis también, pero no podemos hacerlo funcionar)

Tenga en cuenta: no queremos utilizar SQL dinámico cuando Dapper solicita datos de la base de datos (eso es fácil). Queremos ejecutar muchas pequeñas sentencias Linq dinámicas en la colección que devuelve la consulta Dapper.

¿Puede ser que ScottGu dynamic Linq solo funcione con'LinQ to SQL '?

¿Hay algún otro enfoque alternativo para lograr lo mismo? (El rendimiento es una cuestión clave)

/ Erik

Respuesta experta

conn.Query("...")

devuelve un IEnumerable<dynamic> . Sin embargo, "LINQ dinámico" es anterior a la dynamic y, presumiblemente, nadie lo ha actualizado para trabajar con dynamic ; sin duda se podría hacer, pero es trabajo (y no es trivial). Opciones:

  • use Query<T> para algunos T
  • realice los cambios necesarios en "LINQ dinámico", y preferiblemente haga que esos cambios estén disponibles para la comunidad en general

Respuesta popular

Sospecho que conn.Query(“select ACCOUNT, UNIT, AMOUNT from myTable†); devuelve IEnumerable<object> . Para que DLinq funcione, debe tener IEnumerable<TheActualType> .

Puedes intentar esto:

conn.Query<dynamic>("yourQueryString")
   .ToList()
 //.ToAnonymousList()
   .Where("AMOUNT > 0"); 

Si eso no funciona, podría intentar usar ToAnonymousList , que intenta devolver IList<TheActualType .



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é