【问题标题】:LINQ grouping and aggregating data with conditionsLINQ 使用条件对数据进行分组和聚合
【发布时间】:2012-08-24 12:07:59
【问题描述】:

我在理解从 LINQ 查询中获取正确结果的方法时遇到了一些问题。

我先定义实体ProductFavorite

public class ProductFavorite
{
    public Guid Uid {get; set;}

    public Guid ProductUid {get; set;}

    public bool IsFavorite {get; set;}

    public bool IsLastUsed {get; set;}

    public int LastUsedYear {get; set;}
}

我有一些收藏品的IEnumerable,名为allFavorites,其中包含以我之前编写的方式制作的对象。

这个“列表”可以包含重复的元素ProductUid,因为它是从不同的数据源构建的。

再说一遍:“列表”中的项目至少有 IsFavorite = true OR IsLastUsed = true

我当然想使用 LINQ 创建 ProductFavorite 对象的结果列表,但按 ProductUid 对项目进行分组,并将三个属性分组如下:

IsFavorite 仅在分组项目之一将此属性设置为 true 时才为 true

IsLastUsed 仅当其中一个分组项将此属性设置为 true 时才为 true

LastUsedYear 将是分组项目的 LastUsedYear 的最大值

我已经尝试了下一个语法,但我不确定它能否满足我的需求:

var favorites = 
        from ProductFavorite pf in allFavorites
        group pf by pf.ProductUid into distinctFavorites
        select new ProductFavorite()
        {
            Uid = Guid.NewGuid(),
            ProductUid = distinctFavorites.Key,
            LastYearUsed = distinctFavorites.Max(l => l.LastYearUsed) // ???,
            IsFavorite = ...,  // ???
            IsLastUsed = ...   // ???
        };

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您的LastYearUsed(或LastUsedYear?)行看起来不错。对于最后两个你会想要的

    IsFavorite = distinctFavorites.Any(l=>l.IsFavourite),
    IsLastUsed = distinctFavorites.Any(l=>l.IsLastUsed)
    

    (假设您的意思是“任何其中一项已设置为 true”,而不是“完全其中一项...”)

    【讨论】:

    • 是的...我以为我在附近!非常感谢您,也感谢您对 LINQ "Any" 方法的解释...
    • 没问题 MAXE,恭喜你自己走得更远。
    【解决方案2】:
    var favorites = (from ProductFavorite pf in allFavorites
                                 group pf by pf.ProductUid into distinctFavorites
                                 select new ProductFavorite()
                    {
                        Uid = Guid.NewGuid(),
                        ProductUid = distinctFavorites.Key,                    
                        IsFavorite = distinctFavorites.Any(p => p.IsFavorite == true),
                        IsLastUsed = distinctFavorites.Any(p => p.IsLastUsed == true),
                        LastUsedYear = distinctFavorites.Max(l => l.LastUsedYear) 
                    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多