我有一堂课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
在多个属性上使用,但我事先不知道有多少以及哪些属性。例如,我可能想按 just CategoryId
、 justPlantId
或 both 分组。我在网上找到了一篇文章,描述了如何动态地使用 LINQ GrouBy。
这可能确实有效,但如果我想在不知道粒度的情况下ProductionDate.Year
执行Group By?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
需要改进的一部分。