LINQ to SQL - 按日/周/月分组

时间:2011-01-13 11:19:31

标签: c# linq-to-sql group-by func

我现在已经在这个问题上摸不着头脑了。假设我做了一个扩展方法,按日期对项目列表进行分组,我想更改可能的分组,以便结果可以按日,周或月分组。

我想出了下面的内容,但我一直收到以下错误:

  

方法'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...

我假设在Query中使用Func会导致错误,是否可以生成这样的代码?

P.S。我仍然试图围绕Func和表达式:)

2 个答案:

答案 0 :(得分:3)

组语法不应该是:

group a by new MonthDateGroup
{
 a.Day = date.Day, a.Month = date.Month, a.Year = date.Year
}

答案 1 :(得分:2)

您的问题看起来像查询本身无法执行到SQL。在使用之前,您可能需要将项目转换为IEnumerable。请注意,这将导致数据从SQL Server加载到内存中,因此应尽可能在LINQ链中保留。

您可以将items参数更改为IEnumerable而不是IQueryable,或者如果不起作用,请在您的方法中创建变量(靠近顶部)

var itemsEnumerable = items.AsEnumerable();

您还必须将返回类型从IQueryable更改为IEnumerable