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, а также группировка трех свойств следующим образом:

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 = ...   // ???
        };

2 ответов


код LastYearUsed (или LastUsedYear? линия выглядит нормально. За последние два вы захотите

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

(предполагая, что вы имеете в виду "любой один из элементов имеет значение true", а не "ровно один из пунктов...")


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