linq从儿童collections中选择项目

以下是我的课程。 我有一个包含天数列表的产品。 每天都有城市房产。

我需要创建一个linq查询,它将为我提供在系统中所有产品上使用的不同城市。

我试过这样的东西,但它不起作用:

var cities = from product in NHibernateSession.Linq() 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 Days { get; set; } } public class ProductDayDefinition : EntityBase { public virtual Product Product { get; set; } public virtual City City { get; set; } } 

您需要调用SelectMany函数,该函数只需一个项目,您可以从中获取多个项目。

例如:

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

请注意,如果City类未正确实现EqualsGetHashCode ,则会返回重复项。

你可以使用这样的查询理解语法来做到这一点:(未经测试)

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