【问题标题】:Getting only one record from parent with multiple child in Linq (Distinct)在 Linq 中仅从具有多个孩子的父母那里获取一条记录(不同)
【发布时间】:2015-04-08 17:32:53
【问题描述】:

我正在尝试用产品列表填充 Typed GridView,它是最后一个状态。

由于Distinct() 子句,第一个查询工作正常并为每个产品返回一条记录。但是现在我需要显示 LAST 的情况并从其他表中获取一些数据以显示在 TYPED GridView

ProductSituationHistory基本上包含ProductIdSituationId,以跟踪产品获得的所有状态...

public IQueryable<Product> SelectProducts()
            {
            var query = (from ph in db.ProductSituationHistory
                            join p in db.Products on ph.ProductId equals p.Id
                            join s in db.Situation on ph.SituationId equals s.Id
                            select  p).Distinct();
            return query;
            }

所以,我创建了另一个名为 ProductGridView 的类型类(我不喜欢使用匿名类型,如果是强类型,GridView 在这里会更好地工作)查询是这样的:

public IQueryable<ProductGridView> SelectProducts()
    {
            var query = (from ph in db.ProductSituationHistory
                            join p in db.Products on ph.ProductId equals p.Id
                            join s in db.Situation on ph.SituationId equals s.Id
                            select new ProductGridView
                            {
                                Id = p.Id,
                                Name = p.Name,
                                Situation = s.Description,
                                Manufacturer = p.Manufacturer.Name

                            }).Distinct();


            return query;
    }

现在的问题是 Distinct() 不起作用,因为很明显,没有一个 ProductGridView 项会相等(SituationId 发生变化)。如何获取所有产品的列表,同时仅从 ProductSituationHistory 中获取每个产品的最后一条记录?

【问题讨论】:

  • 为什么不能按日期desc排序并取第一条记录?

标签: c# linq linq-to-entities


【解决方案1】:

如何获取所有产品的列表,同时仅从 ProductSituationHistory 中获取每个产品的最后一条记录?

这意味着我们要从Product 开始,而不是ProductSituationHistory,然后加入群组。当您这样做时,您会将所有匹配的历史项目作为一个集合,例如,您可以从中获取最后一个项目。

var query = from p in db.Products 
                join ph in db.ProductSituationHistory 
                on p.Id equals ph.ProductId into history
                let lastHistory = history
                    .OrderByDescending(h=>h.Id)
                    .FirstOrDefault()
                join s in db.Situation 
                on lastHistory.SituationId equals s.Id
                select new ProductGridView
                {
                    Id = p.Id,
                    Name = p.Name,
                    Situation = s.Description,
                    Manufacturer = p.Manufacturer.Name,
                };

【讨论】:

  • 感谢您的解决方案,Servy。但是现在我在运行它时遇到了这个问题:LINQ to Entities 无法识别方法'NovoGRH.ENTITIES.ProductSituationHistory Last[ProductSituationHistory](System.Collections.Generic.IEnumerable`1
  • 我通过将 Last() 替换为 OrderByDescending(h=>h.Id).FirstOrDefault() 使其工作。再次感谢您的帮助!
  • @VitorReis 对此进行了编辑。
  • 你能帮我解决这个 linq 查询吗:stackoverflow.com/questions/38120664/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2023-01-26
  • 1970-01-01
  • 2017-05-31
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多