Linq,选择按容器分组的第一个过期记录的列表
本文关键字:第一个 过期 记录 列表 选择 Linq | 更新日期: 2023-09-27 18:35:40
>我有一个表格水果,看起来有点像这样:
FruitID | BasketID | ExpirationDate | OtherColumns
一个篮子里装着许多水果,其中一些水果已经过期。我正在编写一个查询,该查询返回具有BasketID
的所有记录的列表,这些记录的FruitID
ExpirationDate
大于 UtcNow。这就是我所拥有的,但我正在努力选择组:
var TheExpiredFruits = (from b in MyDC.Fruits
orderby b.ExpirationDate descending
where b.ExpirationDate < DateTime.UtcNow
group b by s.BasketID into TheBaskets
select new MyModel()
{
//here I can't map to MyModel
}).ToList();
我确定我不远,但我不能完全弄清楚。我需要更改什么?
要显示有关最近过期水果的详细信息,您需要如下所示的内容:
var today = DateTime.UtcNow.Date; // lock in UTC date so it doesn't vary during the query
var result = MyDB.Fruits
.Where(x => x.ExpirationDate < today)
.OrderBy(x => x.ExpirationDate)
.GroupBy(x => x.BasketID, (key, items) => new
{
BasketID = key,
MostRecentlyExpiredFruit = items.Last()
})
.Select(x => new MyModel
{
BasketID = x.BasketID,
MostRecentlyExpiredFruitID = x.MostRecentlyExpiredFruit.FruitID,
MostRecentlyExpiredFruitName = x.MostRecentlyExpiredFruit.Name,
HowLongSinceMostRecentExpiration =
today - x.MostRecentlyExpiredFruit.ExpirationDate
});
在查询语法中:
var today = DateTime.UtcNow.Date; // lock in UTC date so it doesn't vary during the query
var result =
from f in MyDC.Fruits
orderby f.ExpirationDate
where f.ExpirationDate < today
group f by f.BasketID into basket
let summary = new
{
BasketID = basket.Key,
MostRecentlyExpiredFruit = basket.Last()
}
select new MyModel
{
BasketID = summary.BasketID,
MostRecentlyExpiredFruitID = summary.MostRecentlyExpiredFruit.FruitID,
MostRecentlyExpiredFruitName = summary.MostRecentlyExpiredFruit.Name,
HowLongSinceMostRecentExpiration =
today - summary.MostRecentlyExpiredFruit.ExpirationDate
};
对于每个篮子,您可以使用最过期的水果创建一个MyModel
对象,并具有以下查询:
List<MyModel> TheExpiredFruits = (from b in MyDC.Fruits
where b.ExpirationDate < DateTime.UtcNow
group b by b.BasketID into fruits
let fruit = fruits.OrderByDescending(f => f.ExpirationDate).First()
select new MyModel()
{
BasketId = fruit.BasketID,
Column1 = fruit.SomeColumn1,
ColumnN = fruit.SomeColumnN,
}).ToList();