创建动态Lambda表达式以转动表

时间:2016-04-12 13:53:47

标签: c# linq dynamic lambda

我正在研究班次调度工作。所需的布局如下:

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

0 个答案:

没有答案