LINQ分组和聚合数据与条件

MAX*_*AXE 6 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;}
}
Run Code Online (Sandbox Code Playgroud)

我有IEnumerable一些最受欢迎的产品,名称allFavorites,包含以我之前写的方式制作的对象.

此"列表"可以包含具有重复项的元素ProductUid,因为它是从不同的数据源构建的.

并再次:"列表"中的项目至少有IsFavorite = true OR IsLastUsed = true.

我想使用LINQ创建一个生成的ProductFavorite对象列表,但是按ProductUid对项目进行分组,并按如下方式对这三个属性进行分组:

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

仅当其中一个分组项目的此属性设置为true时,IsLastUsed才会为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 = ...   // ???
        };
Run Code Online (Sandbox Code Playgroud)

Raw*_*ing 2

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

IsFavorite = distinctFavorites.Any(l=>l.IsFavourite),
IsLastUsed = distinctFavorites.Any(l=>l.IsLastUsed)
Run Code Online (Sandbox Code Playgroud)

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