【问题标题】:linq select items from child collectionlinq 从子集合中选择项目
【发布时间】:2010-01-19 16:59:24
【问题描述】:

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

我需要创建一个 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; }
   }

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    您需要调用SelectMany 函数,该函数接受一个项目并让您从中获取多个项目。

    例如:

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

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

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

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

    【讨论】:

    • 谢谢,这正是我需要的
    • 当我的等效于 Days 的属性在我的所有等效产品类对象中为空时,我得到一个“System.NullReferenceException”。如何避免该异常(即没有首先明确(即通过单独的语句)扫描产品类对象以确保至少有一个具有非空 Days 属性)?希望有类似空条件运算符的东西。
    • @Tom:要么先添加where product.Days != null,要么添加?? Enumerable.Empty&lt;T&gt;()。不过,我不知道这将如何与查询提供程序一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多