在 Linq 中仅从 parent 获取一条记录,其中包含多个 child(不同)

Getting only one record from parent with multiple child in Linq (Distinct)

我正在尝试使用产品列表及其最后状态填充类型化 GridView。

由于 Distinct() 子句,第一个查询工作正常并且每个产品 returns 一条记录。但现在我需要显示 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;
            }

所以,我创建了另一个类型 class,称为 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 项的 none 将相等(SituationId 更改).我怎样才能获得所有产品的列表,同时只从 ProductSituationHistory 中获取每个产品的最后一条记录?

How can I get a list of all products while getting only the last record from ProductSituationHistory for each of them?

这意味着我们要从 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,
                };