C# 创建透视表的动态Lambda表达式

C# 创建透视表的动态Lambda表达式,c#,linq,dynamic,lambda,C#,Linq,Dynamic,Lambda,我在为工作做排班。所需布局如下所示: | Employee1 | Employee2 | Employee3 | etc... ---------------------------------------------------------- Mon | Shift_Type1 | Shift_Type2 | Shift_Type3 | etc... Tue | Shift_Type3 | Shift_Type2 | Shift_Type1 | etc..

我在为工作做排班。所需布局如下所示:

    | Employee1   |  Employee2   |  Employee3   |  etc...
----------------------------------------------------------
Mon | Shift_Type1 |  Shift_Type2 |  Shift_Type3 |  etc...
Tue | Shift_Type3 |  Shift_Type2 |  Shift_Type1 |  etc...
现在,我已经能够提出一个有效的LINQ查询,但它是硬编码的

var dataSource = db.Shifts
            .GroupBy(key => key.Date.Value)
            .Select(shift => new
                {
                    Date = shift.Key,
                    Employee1 = shift.Where(s => s.Employee_ID == "xxxXxx").Max(s => s.Shift_Type.Name)
            });
        GridView_OverView.DataSource = dataSource;
        GridView_OverView.DataBind();
        db.Dispose();
我希望能够调用date列,然后对于db.Employees中的每个员工,我希望在select语句中创建该列的新部分

EmployeeX = shift.Where(s => s.Employee_ID == "xxxXxx").Max(s => s.Shift_Type.Name)
我在表情树上读了一些东西,我试着自己把它们组合起来。但是,每当我尝试运行它时,它都会出现错误

List<System.Data.Linq.Table<Shift>> results = null;
        ParameterExpression parameterExpression = Expression.Parameter(typeof(Shift), "s");

        foreach (Employee employee in db.Employees)
        {

            // s.Employee_ID == "xxxXxx"
            Expression left = Expression.Property(parameterExpression, "Employee_ID");
            Expression right = Expression.Constant(employee.ID_UserName);
            Expression predicateBody1 = Expression.Equal(left, right);

            // s.Shift_Type.Name
            Expression predicateBody2 = Expression.Property(Expression.Property(parameterExpression, "Shift_Type"), "Name");

            // Where(s => s.Employee_ID == "xxxXxx")
            MethodCallExpression whereCallExpression = Expression.Call(
                typeof(Queryable),
                "Where",
                new Type[] { db.Shifts.AsQueryable().ElementType },
                db.Shifts.AsQueryable().Expression,
                Expression.Lambda<Func<Shift, bool>>(predicateBody1, new ParameterExpression[] { parameterExpression })
                );

            // .Max(s => s.Shift_Type.Name)
            MethodCallExpression maxCallExpression = Expression.Call(
                typeof(Queryable),
                "Max",
                new Type[] { db.Shifts.AsQueryable().ElementType },
                whereCallExpression,
                Expression.Lambda<Func<Shift, bool>>(predicateBody2, new ParameterExpression[] { parameterExpression })
                );

            results.AddRange(db.Shifts.AsQueryable().Provider.CreateQuery<System.Data.Linq.Table<Shift>>(maxCallExpression).ToList());
        }
列表结果=null;
ParameterExpression ParameterExpression=Expression.Parameter(typeof(Shift),“s”);
foreach(db.Employees中的员工)
{
//美国员工ID==“xxxXxx”
表达式left=Expression.Property(parameterExpression,“Employee_ID”);
Expression right=Expression.Constant(employee.ID\u用户名);
表达式predicateBody1=表达式.Equal(左、右);
//s.Shift\u Type.Name
Expression predicateBody2=Expression.Property(Expression.Property(parameterExpression,“Shift_Type”),“Name”);
//其中(s=>s.Employee_ID==“xxxXxx”)
MethodCallExpression,其中CallExpression=Expression.Call(
类型(可查询),
“哪里”,
新类型[]{db.Shifts.AsQueryable().ElementType},
db.Shifts.AsQueryable()表达式,
表达式.Lambda(predicateBody1,新的ParameterExpression[]{ParameterExpression})
);
//.Max(s=>s.Shift_Type.Name)
MethodCallExpression maxCallExpression=Expression.Call(
类型(可查询),
“Max”,
新类型[]{db.Shifts.AsQueryable().ElementType},
其中称为表达式,
表达式.Lambda(predicateBody2,新的ParameterExpression[]{ParameterExpression})
);
results.AddRange(db.Shifts.AsQueryable().Provider.CreateQuery(maxCallExpression.ToList());
}
错误是System.ArgumentException,它发生在maxCallExpression中

其他信息:“System.String”类型的表达式不能用于返回类型“System.Boolean”

我被困在这里有一段时间了,我不知道该怎么做才能解决这个问题。我找不到任何关于运行max表达式的文档,也不知道参数需要是什么样的。任何帮助都将不胜感激