[英]Linq not grouping
Given the data below, I am trying to write a LINQ statement that will group by ParentProductId
, and select the maximum EndDate
if there is more than one item in the group.鉴于以下数据,我正在尝试编写一个 LINQ 语句,该语句将按ParentProductId
分组,如果组中有多个项目,则选择最大EndDate
。
Since the data listed below has two items with the same ParentProductId
, I would expect three records to be returned (and for the "2020" date to be used for the ParentProductId = 1
group, not "2019").由于下面列出的数据有两个具有相同ParentProductId
项目,我希望返回三个记录(并且“2020”日期用于ParentProductId = 1
组,而不是“2019”)。 However, the LINQ statement that I have is still returning all four records.但是,我拥有的 LINQ 语句仍然返回所有四个记录。 What am I doing wrong?我究竟做错了什么?
Data:数据:
Subscription.Add(new Subscription() { CustomerId = 555, ParentProductId = 37 , EndDate= null});
Subscription.Add(new Subscription() { CustomerId = 555, ParentProductId = 38 , EndDate = null });
Subscription.Add(new Subscription() { CustomerId = 555, ParentProductId = 1 , EndDate = new DateTime(2019, 11, 28) });
Subscription.Add(new Subscription() { CustomerId = 555, ParentProductId = 1, EndDate = new DateTime(2020, 1, 28) });
LINQ Statement: LINQ 声明:
var IndividualSubscription = (from s in db.Subscriptions
join ptp in db.ProductToProducts on s.ProductToProductId equals ptp.ProductToProductId
join p in db.Products on ptp.ParentProductId equals p.ProductId
where SubscriptionIds.Contains(s.OriginalSubscriptionId)
&& s.CustomerId == CustomerId
group new {ptp.ParentProductId, s.EndDate }
by new
{
s.CustomerId,
ptp.ParentProductId,
p.Name,
s.EndDate,
} into grp
select new NCCN.Model.IndividualGroupSubscription
{
CustomerId = grp.Key.CustomerId,
ParentProductId = grp.Key.ParentProductId,
ParentProductName = grp.Key.Name,
EndDate = grp.Max(p => p.EndDate),
}).ToList();
Note sure why your linq is that overkill but following your written requirement and not your code what you need is a million times shorter than what you have wrote请注意为什么你的 linq 是过分的,但遵循你的书面要求而不是你的代码你需要的比你写的短一百万倍
// get grouped by product id
var result = Subscription.GroupBy(s => s.ParentProductId)
// select to output something for each group. What you want is
// order descending all elements and pick the first which is the highest
.Select(grp => grp.OrderByDescending(o => o.EndDate).FirstOrDefault())
// returned as a list
.ToList();
You group for {ptp.ParentProductId, s.EndDate }
.您为{ptp.ParentProductId, s.EndDate }
。
Group only for ParentProductId, if you need 3 rows result.如果您需要 3 行结果,则仅为 ParentProductId 分组。
var subscription = new List<Subscription>(){new Subscription() { CustomerId = 555, ParentProductId = 37 , EndDate= null}
,new Subscription() { CustomerId = 555, ParentProductId = 38 , EndDate = null }
,new Subscription() { CustomerId = 555, ParentProductId = 1 , EndDate = new DateTime(2019, 11, 28) }
,new Subscription() { CustomerId = 555, ParentProductId = 1, EndDate = new DateTime(2020, 1, 28) }
};
var query = subscription
.GroupBy(x=> x.ParentProductId)
.Select(x=> new {x.Key, EndDate = x.Max(s=>s.EndDate)});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.