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();

我确定我不远,但我不能完全弄清楚。我需要更改什么?

Linq,选择按容器分组的第一个过期记录的列表

要显示有关最近过期水果的详细信息,您需要如下所示的内容:

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();