2010-01-19 3 views
22

Ниже приведены мои занятия. У меня есть продукт, содержащий список дней. Каждый день имеет свойство города.linq выбрать товары из детской коллекции

Мне нужно создать запрос linq, который даст мне разные города, которые используются для всех моих продуктов в системе.

Я пытался что-то вроде этого, но он не работает:

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

ответ

43

Вам нужно вызвать функцию SelectMany, которая принимает один элемент и позволяет получить несколько элементов из него.

Например:

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

Обратите внимание, что если City класс не реализует Equals и GetHashCode правильно, это будет возвращать дубликаты.

Вы можете сделать это с помощью синтаксиса запросов на слух, как это: (непроверенные)

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

Спасибо, это именно то, что мне нужно – GuestMVCAsync

Смежные вопросы