2010-01-19 29 views
22

A continuación se encuentran mis clases. Tengo un producto que contiene la lista de días. Cada día tiene una propiedad de la ciudad.linq seleccionar elementos de la colección infantil

Necesito crear una consulta de linq que me proporcione las distintas ciudades que se usan en todos mis productos en el sistema.

he intentado algo como esto pero no funciona:

var cities = from product in NHibernateSession.Linq<Product>() select new { city = product.Days.Where(d => d.City != null).Distinct() }; //This returns the day items but i need distinct cities 

    public class Product : EntityBase 
    { 
     public virtual string Name { get; set; } 
     public virtual IList<ProductDayDefinition> Days { get; set; } 
    } 

    public class ProductDayDefinition : EntityBase 
    { 
     public virtual Product Product { get; set; } 
     public virtual City City { get; set; } 
    } 

Respuesta

43

es necesario llamar a la función SelectMany, que tiene un solo elemento y le permite obtener varios artículos de la misma.

Por ejemplo:

var cities = NHibernateSession.Linq<Product>() 
       .SelectMany(p => p.Days) 
       .Select(p => p.City) 
       .Where(c => c != null) 
       .Distinct(); 

Tenga en cuenta que si la clase no implementa CityEquals y GetHashCode correctamente, esto volverá duplicados.

Usted puede hacer esto utilizando la sintaxis de la comprensión consulta como esta: (no probado)

var cities = (from product in NHibernateSession.Linq<Product>() 
       from day in product.Days 
       where day.City != null 
       select day).Distinct(); 
+0

Gracias, esto es exactamente lo que necesitaba – GuestMVCAsync

Cuestiones relacionadas