我正在研究班次调度工作。所需的布局如下:
| 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)
我在表达树here in this article上读了一些,我试着把自己放在一起。但是,每当我尝试运行它时都会出现错误。
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());
}
错误是一个System.ArgumentException,它发生在maxCallExpression中。
其他信息:'System.String'类型的表达式不能用于返回类型'System.Boolean'
我已经被困在这里一段时间了,我不知道该怎么做才能解决这个问题。我找不到任何关于运行max表达式的文档,我不知道参数需要是什么样的。任何帮助将不胜感激。