4

一段时间以来,我一直在为这个问题挠头。假设我做了一个扩展方法,按日期对项目列表进行分组,我想更改可能的分组,以便结果可以按日、周或月分组。

我想出了以下内容,但我不断收到以下错误:

方法“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 会导致错误,是否可以生成这样的代码?

PS我仍在尝试围绕Func和Expressions :)

4

2 回答 2

3

组语法不应该是:

group a by new MonthDateGroup
{
 a.Day = date.Day, a.Month = date.Month, a.Year = date.Year
}
于 2011-01-13T11:59:44.300 回答
2

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

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

var itemsEnumerable = items.AsEnumerable();

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

于 2011-01-13T12:51:08.017 回答