LINQ DynamicLibrary: как извлечь количество и список из IQueryable - PullRequest
4 голосов
/ 03 марта 2011

Я начал немного экспериментировать с динамической библиотекой LINQ. Я пытаюсь заменить группу операторов LINQ несколькими или только одним динамическим запросом LINQ. Мой существующий статический запрос выглядит следующим образом:

private List<TicketChartData> GenerateImpl(IList<ServiceItem> myList)
{
    var output = from ticket in myList
             group ticket by ticket.Region into grouped
             orderby grouped.Count() descending
             select new TicketChartData(grouped.Key, grouped.Count(), grouped.ToList());
    return output.ToList();
}

Как видите, моя единица работы - ServiceItem. Это работает все отлично и дает мне набор результатов, сгруппированных по Region. Используя DynamicLibrary, я пытаюсь группировать по любому допустимому динамическому полю (я буду обрабатывать любые проверки отдельно). Итак, я попытался написать тот же запрос, используя DynamicLibrary, но не очень успешно Вот новый метод, который, конечно, не компилируется:

private List<TicketChartData> GenerateImpl(IList<ServiceItem> myList, string field)
{
    IQueryable<ServiceItem> queryableList = myList.AsQueryable<ServiceItem>();
    IQueryable groupedList = queryableList.GroupBy(field,"it").
                            OrderBy("Key descending").
                            Select("new (Key as Key)"); // Not what i need
    return output.ToList();
}

Мне не удалось извлечь ни Count, ни List из группировки. Как мне это сделать? Я потратил значительное количество времени в поисках решения. Если возможно, я хочу избегать использования Reflection. У меня есть несколько указателей в этой области по следующей ссылке, но это не помогает моей реальной проблеме. Заранее спасибо за любую помощь.

System.LINQ.Dynamic: выберите ("new (...)") в список (или любую другую перечисляемую коллекцию )

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Для Количество это можно записать следующим образом:

private List GenerateImpl(IList myList, string field)
{
    IQueryable queryableList = myList.AsQueryable();
    IQueryable groupedList = queryableList.GroupBy(field,"it").
                            OrderBy("Key descending").
                            Select("new (Key as Key, Count() as Count)");

    // Note: IQueryable doesn't have ToList() implementation - only IEnumerable 
    return output.ToList(); // will not work
}

Для Список - возможно, вам потребуется добавить свою собственную реализацию в DynamicLibrary ..Посмотрите, как это было сделано для метода Contains () здесь

0 голосов
/ 06 октября 2014

Решение состоит в том, чтобы использовать .QueryByCube метод расширения LINQ, предоставленный моим продуктом AdaptiveLINQ .

Отказ от ответственности: я являюсь разработчиком AdaptiveLINQ

...