C# 动态linq不';Don’我好像在一个GroupBy子句中工作

C# 动态linq不';Don’我好像在一个GroupBy子句中工作,c#,entity-framework,linq,dynamic,linq-to-sql,C#,Entity Framework,Linq,Dynamic,Linq To Sql,我有一个问题,我们有很多数据分组到所谓的阶段。前端希望在呈现数据之前显示这些数据,并将其分阶段分组。阶段的数量是可变的。因此,最初他们是在每个阶段制作一个api,以便在绑定到网格控件之前聚集数据 当阶段的数量变得相当高时,它就会变得太慢。浏览器将对api请求进行排队,总体响应时间将非常长。我们决定,最好是使用一个api调用来处理分组和分页。也就是说,你可以说‘take=30’,它会给出每个阶段的30条记录,不管有多少个阶段 因此,后端的查询与下面的查询类似。问题在于,在跳过和执行之前,数据的排序

我有一个问题,我们有很多数据分组到所谓的阶段。前端希望在呈现数据之前显示这些数据,并将其分阶段分组。阶段的数量是可变的。因此,最初他们是在每个阶段制作一个api,以便在绑定到网格控件之前聚集数据

当阶段的数量变得相当高时,它就会变得太慢。浏览器将对api请求进行排队,总体响应时间将非常长。我们决定,最好是使用一个api调用来处理分组和分页。也就是说,你可以说‘take=30’,它会给出每个阶段的30条记录,不管有多少个阶段

因此,后端的查询与下面的查询类似。问题在于,在跳过和执行之前,数据的排序是在一个动态字段中进行的,而这正是它要处理的地方。动态Linq似乎不起作用(尽管它在GroupBy调用之外的正常查询中工作得非常好),而且我也无法让大量的扩展方法发挥作用。它们都是以下错误的一些变体:(请记住,问题是如何让它与LINQtoSQL一起工作)

TestEntities context=newtestentities();
列出结果;
//这是可行的(设计时硬编码)
结果=context.TestTable1.GroupBy(x=>x.StageId)
.SelectMany(x=>x.OrderBy(y=>y.StageId).Skip(1).Take(1)).ToList();
//这是可行的(在设计时使用硬编码函数)
Func orderByExpression=x=>x.StageId;
结果=context.TestTable1.GroupBy(x=>x.StageId)
.SelectMany(x=>x.OrderBy(orderByExpression).Skip(1).Take(1)).ToList();
//这不管用。动态linq
结果=context.TestTable1.GroupBy(x=>x.StageId)
.SelectMany(x=>x.AsQueryable().OrderBy(“Name”).Skip(1.Take(1)).ToList();
//这不管用。无法将对象转换为基元类型
Func orderByObjectExpression=x=>x.StageId;
结果=context.TestTable1.GroupBy(x=>x.StageId)
.SelectMany(x=>x.AsQueryable().OrderBy(orderByObjectExpression).Skip(1).Take(1)).ToList();
//这不管用。同上
Func orderByDynamicExpression=x=>x.StageId;
结果=context.TestTable1.GroupBy(x=>x.StageId)
.SelectMany(x=>x.AsQueryable().OrderBy(orderByObjectExpression).Skip(1).Take(1)).ToList();
WriteLine(JsonConvert.SerializeObject(result));
Console.ReadKey();

的可能重复项不能将反射与linq一起使用到SQLQ您能给我们展示一下您的方法定义吗(我想看看orderByObjectExpression是如何传递给该方法的)?您总是在同一个表上工作,还是希望有通用代码在任何表上工作?顺便说一句,您可以检查称为可扩展Linq或可扩展查询的东西。带有表达式树的代码发射也会有所帮助。@Arthur非常感谢您的回复。方法定义与您看到的非常相似,它不是传入的,而是显式声明的。我在设计时显式声明代码的任何实例都可以工作,但正如您所指出的,我的目标是使其具有通用性,因为客户机指定的排序方式字段可能是许多值中的一个,直到运行时才知道。我不总是在同一个表上工作,但我很高兴现在只在一个表上工作。可能的重复不能使用linq到SQL的反射。您能给我们看一下您的方法定义吗(我想看看orderByObjectExpression是如何传递给该方法的)?您总是在同一个表上工作,还是希望有通用代码在任何表上工作?顺便说一句,您可以检查称为可扩展Linq或可扩展查询的东西。带有表达式树的代码发射也会有所帮助。@Arthur非常感谢您的回复。方法定义与您看到的非常相似,它不是传入的,而是显式声明的。我在设计时显式声明代码的任何实例都可以工作,但正如您所指出的,我的目标是使其具有通用性,因为客户机指定的排序方式字段可能是许多值中的一个,直到运行时才知道。我不总是在同一张桌子上工作,但我很高兴现在只为一张桌子工作。
        TestEntities context = new TestEntities();

        List<TestTable1> result;

        // This works (Hard coding at design time)
        result = context.TestTable1.GroupBy(x => x.StageId)
            .SelectMany(x => x.OrderBy(y => y.StageId).Skip(1).Take(1)).ToList();

        // This works (using a hard coded function at design time)
        Func<TestTable1, int> orderByExpression = x => x.StageId;
        result = context.TestTable1.GroupBy(x => x.StageId)
            .SelectMany(x => x.OrderBy(orderByExpression).Skip(1).Take(1)).ToList();

        // This doesn't work. Dynamic linq            
        result = context.TestTable1.GroupBy(x => x.StageId)
            .SelectMany(x => x.AsQueryable().OrderBy("Name").Skip(1).Take(1)).ToList();

        // This doesn't work. Can't convert an object to a primitive type
        Func<TestTable1, object> orderByObjectExpression = x => x.StageId;
        result = context.TestTable1.GroupBy(x => x.StageId)
            .SelectMany(x => x.AsQueryable().OrderBy(orderByObjectExpression).Skip(1).Take(1)).ToList();

        // This doesn't work. Same as above
        Func<TestTable1, dynamic> orderByDynamicExpression = x => x.StageId;
        result = context.TestTable1.GroupBy(x => x.StageId)
            .SelectMany(x => x.AsQueryable().OrderBy(orderByObjectExpression).Skip(1).Take(1)).ToList();           

        Console.WriteLine(JsonConvert.SerializeObject(result));
        Console.ReadKey();