私はクラスを持っていますProduct
:
class Product
{
int Id { get; set; }
string Name { get; set; }
int CategoryId { get; set; }
int PlantId { get; set; }
DateTime ProductionDate { get; set; }
}
複数のプロパティでを使用したいのですがLINQ GroupBy
、どのプロパティがいくつあるか事前にわかりません。CategoryId
たとえば、 のみ、PlantId
または両方でグループ化したい場合があります。LINQ GrouBy を動的に使用する方法を説明しているネット上の記事を見つけました。
これは確かにうまくいくかもしれませんが、事前に粒度を知らずに Group ByProductionDate.Year
を実行したい場合はどうなりますか? ProductionDate.Month
粒度とは、特定の年に生産されたすべてのものをグループ化するかProducts
、グループを月ごとに絞り込むかを意味します。
私が見つけた唯一の論理的な解決策は次のとおりです。
public ProductInfo GetGroupedProducts(int? year, int? month, int? selectedCategoryId, int? selectedPlantId)
{
List<Product> products = GetProducts();
var groupedProducts = products.GroupBy(p => new { (year == null ? p.ProductionDate.Year : string.Empty),
(month == null ? p.ProductionDate.Month : string.Empty),
(selectedCategoryId == null ? p.CategoryId : string.Empty),
(selectedPlantId == null ? p.PlantId : string.Empty)
});
//perform some additional filtering and assignments
}
しかし、よりクリーンで適切な解決策があると思います。文字列に基づいてクエリを作成する古いスタイルの方法を使用すると、このタスクははるかに簡単に実行できました。LINQ
他に方法がない場合、これは改善が必要な部分だと本当に思います。