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

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引起了错误,是否有可能产生像这样的代码呢?

另外,我仍在努力理解Func和Expressions:)

2个回答

3

应该将组语法改为:

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

2

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

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

var itemsEnumerable = items.AsEnumerable();

您还需要将返回类型从IQueryable更改为IEnumerable。

我需要在SQL中执行查询。如果我删除泛型和Func参数并将其绑定到一个类,这个查询就可以正常工作,但是由于性能限制,我需要支持多个查询的泛型支持,并且必须在SQL中执行。我认为我缺少使查询工作所需的语法糖。 - Hux
我不确定是否可以修改Linq to SQL,因为您基本上必须找出SQL生成的位置,以便在其中放置自己的代码。由于这是一个分组任务,您是否已经尝试在服务器上执行它?我认为性能可能与在SQL上执行相当,因为返回的数据量相同。 - Matthew Steeples

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接