【问题标题】:LINQ to SQL - Group By Day/Week/MonthLINQ to SQL - 按天/周/月分组
【发布时间】:2011-01-13 11:19:31
【问题描述】:

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

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

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

附:我仍在尝试围绕 Func 和表达式 :)

【问题讨论】:

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


    【解决方案1】:

    组语法不应该是:

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

    【讨论】:

      【解决方案2】:

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

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

      var itemsEnumerable = items.AsEnumerable();
      

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

      【讨论】:

      • 我需要在 SQL 中执行查询。如果我删除泛型和 Func 参数并将其绑定到一个类,则此查询工作正常,但我需要对多个查询的泛型支持,并且由于性能限制,它必须在 SQL 中执行。我假设我缺少使查询工作所需的语法糖
      • 我不确定是否可以将 Linq 修改为 SQL,因为您基本上必须找出生成 SQL 的位置才能将自己的位放在那里。由于这是一项分组任务,您是否尝试过在服务器上执行它?我认为性能可能等同于在 SQL 上执行它,因为仍然返回相同数量的数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多