带动态分组依据的 LINQ

LINQ with dynamic group by

我有型号:

public class Student
{                
    public string Name{ get; set; }  
    public DateTime BirthDate{ get; set; }        
    public string UniversityName{ get; set; }  
    public decimal Balance{ get; set; }        
}

我有三个 bool 变量:

并基于它们,我需要创建 GroupBy。如果 IsBirthDate=true 那么

DbContext.Students.GroupBy(x => new { x.BirthDate }).Select(s => new
        {
            s.Key.BirthDate,                
            Balance = s.Sum(x => x.Balance).ToString(),                
        });

如果IsBirthdate=true, IsUniversityName=true那么

DbContext.Students.GroupBy(x => new { x.BirthDate, x.UniversityName }).Select(s => new
        {
            s.Key.BirthDate,
            s.Key.UniversityName,                
            Balance = s.Sum(x => x.Balance).ToString(),                
        });

和其他带有 bool 参数的选项。

如何使用 .GroupBy and .Select 动态生成查询?

也许这对您有帮助:创建一个 class 代表您的 GroupBy:

的密钥
public class StudentGroupingKey
{                
    public string Name { get; set; }  
    public DateTime? BirthDate{ get; set; }        
    public string UniversityName { get; set; }
}

如果 IsName 为真,则分组键的 Name 属性 将是值,否则它应该始终具有相同的值(例如 null)。在您的 Select 方法中,您必须始终拥有每个 属性,但如果相应的属性为假,则它们将为空。如果您需要这些属性不存在,则您不能使用匿名类型。在这种情况下,也许 dynamic 可能是一个选择。

DbContext.Students.GroupBy(x => new StudentGroupingKey
{
    Name = IsName ? x.Name : null,
    BirthDate = IsBirthDate ? x.Birthdate : null,
    UniversityName = IsUniversityName ? x.UniversityName : null
}).Select(s => new
{
   s.Key.BirthDate,
   s.Key.Name,
   s.Key.UniversityName,
   Balance = s.Sum(x => x.Balance).ToString()
});