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表达式的文档,也不知道参数需要是什么样的。任何帮助都将不胜感激