我想从列表中找到一条应该是列表的MAX(id)的记录。此记录用于在网格视图中显示。
var cacheProducts = nettingOffAudService.All().TOList();
Product product = productService.FindBy(x => x.ProductName == "NETOFF");
var MasterRenewal = masterRenewalAudService.All().Where(x => x.ProductSeq == product.Id ).ToList();
在这里,我想将MasterRenewal的一列与cacheProducts的ID进行匹配,所以我试着跟着
var jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (
from p in cacheProducts
join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
from MR in MRRenewal.DefaultIfEmpty()
select new
{
cell = new Object[]
{
p.Id.ToString(),
B.BranchName,
p.AccountNumber,
p.ClientName,
MR==null?"":((enumRecStatusMasterRenewal)MR.RecordStatus).GetDescriptionEnum(),
p.Status.GetStatusString(),
}
}).ToArray()
};
如果MasterRenewal包含多个具有相同MstSeq的记录,那么我想采用最后生成的记录MAX(id)。为此我试着跟随
join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
from MR in MRRenewal.Max(x=>x.Id).First().DefaultIfEmpty()
但这不起作用,那怎么办?请任何人帮忙。
答案 0 :(得分:3)
我认为你不需要加入。一个简单的子查询就足够了,现在数据库SQL优化器很容易就可以在必要时将它们变成连接。
所以我建议使用类似的东西
// ...
from p in cacheProducts
let MR = MasterRenewal.Where(r => r.MstSeq == p.Id).OrderByDescending(r => r.Id).FirstOrDefault()
// the rest
更新:以下是与
相同的内容// ...
from p in cacheProducts
join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
let MR = MRRenewal.OrderByDescending(r => r.Id).FirstOrDefault()
// the rest
我不知道为什么你坚持加入,我已经在类似的关系上测试了两个变体,并且它们产生了一个相同的结果(使用左外连接语义)。
答案 1 :(得分:2)
我认为你想要的是以下
var uniqueMasterRenewal = MasterRenewal.GroupBy(mr => mr.MstSeq)
.Select(grp => grp.OrderByDescending(mr => mr.Id).FirstOrDefault());
from p in cacheProducts
join MR in uniqueMasterRenewal on p.Id equals MR.MstSeq into MRRenewal
from MR in MRRenewal.DefaultIfEmpty()
...
这会将MasterRenewal
中的项目按MstSeq
分组,然后按Id
降序排列每个组,以便First
项目是最大的项目Id
的值。