在 Linq 中仅从 parent 获取一条记录,其中包含多个 child(不同)
Getting only one record from parent with multiple child in Linq (Distinct)
我正在尝试使用产品列表及其最后状态填充类型化 GridView。
由于 Distinct()
子句,第一个查询工作正常并且每个产品 returns 一条记录。但现在我需要显示 LAST 情况并从其他表中获取一些数据以显示在 TYPED GridView
.
(ProductSituationHistory 基本上包含 ProductId 和 SituationId, 以跟踪所有产品获得的状态...
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,
};
我正在尝试使用产品列表及其最后状态填充类型化 GridView。
由于 Distinct()
子句,第一个查询工作正常并且每个产品 returns 一条记录。但现在我需要显示 LAST 情况并从其他表中获取一些数据以显示在 TYPED GridView
.
(ProductSituationHistory 基本上包含 ProductId 和 SituationId, 以跟踪所有产品获得的状态...
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,
};