Динамический linq не работает внутри предложения GroupBy - PullRequest
1 голос
/ 14 октября 2019

У меня проблема с тем, что у нас много данных, сгруппированных в так называемые этапы. Внешний интерфейс хочет отобразить эти данные, сгруппированные по этапам, перед их рендерингом. Количество этапов является переменным. Поэтому изначально они делали api за этап для объединения данных перед привязкой к элементу управления сеткой.

Когда число этапов становится достаточно большим, оно становится слишком медленным. Браузер будет ставить в очередь запросы API, и общее время ответа будет очень большим. Лучше - мы решили - было бы иметь один вызов API, который может иметь дело с группировкой и подкачкой. То есть вы могли бы сказать «take = 30», и это дало бы вам 30 записей КАЖДОГО этапа, как бы много ни было этапов.

Таким образом, запрос на серверной части выглядит так, как показано ниже. Проблема заключается в том, что сортировка данных перед пропуском и извлечением происходит в динамическом поле, и именно здесь они и падают. Динамический Linq, похоже, не работает (хотя он отлично работает для обычных запросов вне вызова GroupBy), и я не смог заставить работать ни один из огромного числа методов расширения. Все они представляют собой несколько вариантов ошибок, которые вы найдете ниже: (Имейте в виду, проблема заключается в том, чтобы заставить его работать с linq to sql)

        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();
...