LINQ分组和聚合数据与条件

时间:2012-08-24 12:08:00

标签: c# linq

我在理解从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对项目进行分组,并按如下方式对这三个属性进行分组:

  

仅当其中一个分组项目的此属性设置为true时,IsFavorite才会为真

     

仅当其中一个分组项目的此属性设置为true

时,I​​sLastUsed才会为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 = ...   // ???
        };

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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