2009-08-20 17 views
6

En una de mis preguntas anteriores sobre el uso de cadenas creadas dinámicamente (cláusulas where) y su uso en LINQ, fui guiado hacia LINQ Dynamic Query Biblioteca Dynamic LINQ.Uso de LINQ Dynamic Query Library con Dictionary <string, object> y .AsQueryable()

El primer problema fue que solo se aplica a IQueryable, sin embargo, esto se puede solucionar utilizando el método de extensión .AsQueryable() en cualquier IEnumerable.

El problema con el que me encontré fue que Dynamic LINQ está buscando una Propiedad llamada "CustomerID" (o lo que sea que se haya pasado al predicado de cadena para dynamic linq) en mi Diccionario. Lo que obviamente no funcionará ya que un diccionario solo tiene claves y valores.

Así que pensando que estoy siendo inteligente, creé una clase que extendía : Dictionary<string, object>, ICustomTypeDescriptor`.

Esto me permitió omitir GetProperties() en el tipo. Lo cual es genial. Ahora puedo iterar las teclas del Diccionario y agregarlas a un PropertyDescriptorCollection que se devuelve.

Pero luego me encontré con otro problema. A lo largo de la biblioteca Dynamic LINQ, trabajan con 'Expression instance' que solo contiene un Type. Pero para que mi solución CustomTypeDescriptor funcione, necesito una instancia real del Tipo, antes de poder aplicar TypeDescriptor.GetProperties(instance, false).

Para llegar a la pregunta real. Tomando toda la información anterior en cuenta, ¿cómo aplico una cláusula where personalizada en formato de cadena "CustomerID = 1234 AND Quantity> = 10000" a una consulta LINQ si los datos están almacenados en un diccionario con pares clave-valor.

Mi solución actual está transformando los datos en un DataTable y utilizando el método .Select(query). Lo cual funciona, pero estoy interesado en encontrar otras soluciones. Especialmente para propósitos de evaluación comparativa.

¿Alguna idea?

Respuesta

2

En primer lugar - si usted tiene acceso a un diccionario de esta manera, entonces usted no está utilizando como un diccionario - ¿Has probado:

var qry = myDictionary.Values.AsQueryable().Where(sQuery); 

(tenga en cuenta que si está utilizando object, podrás probablemente querrá un Cast<Customer> o OfType<Customer> en alguna parte)

lo contrario:

el T en IEnumerable<T> (y por tanto también para IQueryable<T> después de llamar al AsQueryable() método de extensión) para un Dictionary<TKey,TValue> es KeyValuePair<TKey,TValue> - por lo que debería poder utilizar Where("Value.CustomerID == 12345") o algo similar.

+1

Interesante opinión sobre esto. Sin embargo, var qry = myDictionary.Values.AsQueryable(). Where (sQuery); solo buscaría en los valores del diccionario que son todos los objetos, por lo que aún no puede obtener el nombre real que está almacenado en las claves "CustomerID". Con su segunda sugerencia, lo más cercano que pude para obtener algo que funcione con la biblioteca dynamic linq es usando: cadena de búsqueda como: "Keys [" CustomerID "] == 12345", pero todavía explota más en la biblioteca , dado que memberinfo devuelto es solo una referencia a KeysCollection y no al valor específico. – Jabezz

Cuestiones relacionadas