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
类未正确实现Equals
和GetHashCode
,则会返回重复项。
你可以使用这样的查询理解语法来做到这一点:(未经测试)
var cities = (from product in NHibernateSession.Linq() from day in product.Days where day.City != null select day).Distinct();