Подтвердить что ты не робот

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

Ответ 1

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

Например:

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

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

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

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