Тип аргументы не могут быть выведены из использования, кто-нибудь может помочь, пожалуйста? - PullRequest
3 голосов
/ 21 сентября 2011

Я пытаюсь использовать Dynamic Linq (опубликованный ScottGu) для создания GroupBy (лямбда-выражения).У меня есть объект.И я делаю AsQueryable.Это то, что у меня есть ..

var result = Items.AsQueryable().GroupBy("DeliveryDate");

, но это дает мне ошибку, говоря, что аргументы не могут быть выведены из использования.Я думаю, что не смотрит на правильный OrderBy.

Предметы это List<Stock>.

Я пытался добавить <> к GroupBy, но я думаю, что мне нужно пропустить более 1 пункта.Я немного сбит с толку.

Поле, которое я передаю (через строку), может быть любого типа, в данном примере это DateTime.

Если я делаю свой стандартный LINQ, то этоработает.то есть:

var result = Items.AsQueryable().GroupBy( x => x.DeliveryDate);

Вот метод расширения (от ScottGu):

public static IQueryable GroupBy(this IQueryable source, string keySelector, string elementSelector, params object[] values) {
    if (source == null) throw new ArgumentNullException("source");
    if (keySelector == null) throw new ArgumentNullException("keySelector");
    if (elementSelector == null) throw new ArgumentNullException("elementSelector");
    LambdaExpression keyLambda = DynamicExpression.ParseLambda(source.ElementType, null, keySelector, values);
    LambdaExpression elementLambda = DynamicExpression.ParseLambda(source.ElementType, null, elementSelector, values);
    return source.Provider.CreateQuery(
        Expression.Call(
            typeof(Queryable), "GroupBy",
            new Type[] { source.ElementType, keyLambda.Body.Type, elementLambda.Body.Type },
            source.Expression, Expression.Quote(keyLambda), Expression.Quote(elementLambda)));
}

У меня есть использование в проекте using System.Linq.Dynamic; - и я использую динамический OrderBy вдругой метод, поэтому я знаю, что он должен его видеть.

Я немного растерялся, кажется, что при использовании динамического LINQ он не понимает, какой объект я использую.

1 Ответ

5 голосов
/ 21 сентября 2011

метод расширения с этой подписью

public static IQueryable GroupBy(this IQueryable source, 
        string keySelector, string elementSelector, params object[] values)

не вызывается этой строкой

var result =  Items.AsQueryable().GroupBy("DeliveryDate");

, поскольку есть только один не- this аргумент! Таким образом, компилятор думает, что вы после обычного GroupBy (который занимает Func) и запутался.

Вам необходимо указать другую selector строку.

изменить добавить

Обычный GroupBy имеет много перегрузок , и поэтому Dynamic Linq должен предложить такую ​​же гибкость. GroupBy создает последовательность групп, каждая из которых имеет ключ и последовательность элементов . Если, как и при обычном вызове LINQ, элементы не упоминаются, сами исходные объекты используются в качестве элементов.

Например, используя некоторые гипотетические классы, группировка Orders по OrderDate дает IEnumerable<IGrouping<DateTime, Order>>.

Но мы могли бы сказать, что мы заботимся только о OrderId в выводе, поэтому мы могли бы дать GroupBy elementSelector, чтобы он вывел IEnumerable<IGrouping<DateTime, int>>.

Чтобы указать Dynamic Linq на использование самого Item в качестве элемента, мы используем волшебную строку "it" в качестве elementSelector:

var result = Items.AsQueryable().GroupBy("DeliveryDate", "it");

Это должно иметь тот же эффект, что и обычный вызов LINQ

var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate);
...