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