2009-05-18 16 views
15

Estoy intentando utilizar el PredicateBuilder, tal como se describe aquí - http://www.albahari.com/nutshell/predicatebuilder.aspxLINQ PredicateBuilder - Múltiples OR

El siguiente código

var predicate = PredicateBuilder.False<StreetDTO>(); 

     predicate = predicate.Or(p => p.Locality.Contains(criteria.Locality)); 
     predicate = predicate.Or(p => p.Name.Contains(criteria.Name)); 
     predicate = predicate.Or(p => p.Town.Contains(criteria.Town)); 

     List<StreetDTO> streetData = StreetData.Instance(); 

     var streetList = from street in streetData.Where(predicate) 
         select street; 

por lo que yo veo este trabajo debe , de acuerdo con el ejemplo

var newKids = Product.ContainsInDescription ("BlackBerry", "iPhone"); 

var classics = Product.ContainsInDescription ("Nokia", "Ericsson") 
         .And (Product.IsSelling()); 
var query = 
    from p in Data.Products.Where (newKids.Or (classics)) 
    select p; 

pero todo lo que consigo es

Error 1 Los argumentos de tipo para el método 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' no pueden ser inferirse del uso. Pruebe especificando los argumentos de tipo explícitamente.

Estoy tratando de obtener un poco de comprensión en LINQ 'en el trabajo', así que le pido disculpas si esta es una pregunta simple.

+0

gracias por que me haga saber acerca PredicateBuilder !! – Romias

Respuesta

18

Ah; su lista está utilizando IEnumerable<T> métodos de extensión (en lugar de IQueryable<T>) - Proveedores:

var streetList = from street in streetData.AsQueryable().Where(predicate) 
       select street; 
+0

Esa es la única - ¡gracias! Necesitaré conseguir un libro de Linq decente, no creo que sea algo que se pueda aprender en el casco ... – Duncan

+2

LINQ in Action, o los capítulos posteriores de C# en profundidad son bastante buenas. –

+0

Gracias Marc por las indicaciones sobre LINQ en acción. =) –

11

tratar de compilar el predicado:

var streetList = from street in streetData.Where(predicate.Compile()) 
       select street; 
+0

Gracias, esto también funcionó, aunque marqué a Marc como la respuesta ya que encontré otra respuesta que coincidía con la suya en otro lugar. No estoy seguro de qué manera es la preferida? – Duncan

+0

@Duncan, no estoy seguro de que la bruja sea la forma preferida tampoco :(Esto tiene que ver con la forma en que linq funciona es magia * en el interior *. No creo que tenga problemas importantes en términos de rendimiento si use uno u otro. –

Cuestiones relacionadas