LINQ to SQL - группировка по дням / неделям / месяцам - PullRequest
4 голосов
/ 13 января 2011

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

Я пришел к следующему, но я продолжаю получать следующую ошибку:

Метод 'System.Object DynamicInvoke (System.Object [])' не имеет поддерживаемого перевода в SQL

Метод:

public static IQueryable<IGrouping<MonthDateGroup, T>> GroupByDate<T>(
    this IQueryable<T> items,
    DateGroupFrequency grouping,
    Expression<Func<T, DateTime?>> func)
{
    var selector = func.Compile();
    IQueryable<IGrouping<MonthDateGroup, T>> grouped = null;

    if (grouping == DateGroupFrequency.Daily)
    {
        grouped = from a in items
                  let date = selector(a).Value
                  group a by new MonthDateGroup
                  {
                      Day = date.Day, Month = date.Month, Year = date.Year
                  } 
                  into g
                  select g;
    }
    //Rest of groupings...

Я предполагаю, что использование Func в Query вызывает ошибку, возможно ли создать код, подобный этому?

PS Я все еще пытаюсь обернуть мойОбойдите вокруг Func's и выражения:)

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Если групповой синтаксис не будет:

group a by new MonthDateGroup
{
 a.Day = date.Day, a.Month = date.Month, a.Year = date.Year
}
2 голосов
/ 13 января 2011

Ваша проблема выглядит так, как будто сам запрос не может быть выполнен в SQL. Возможно, вам придется конвертировать ваши элементы в IEnumerable перед его использованием. Обратите внимание, что это приведет к загрузке данных в память с сервера SQL, поэтому их следует оставлять как можно позже в цепочке LINQ.

Вы можете изменить параметр items на IEnumerable, а не IQueryable, или, если это не сработает, создать переменную в вашем методе (вверху)

var itemsEnumerable = items.AsEnumerable();

Вам также придется изменить тип возврата с IQueryable на IEnumerable

...