2011-01-13 105 views
4

我一直在摸索着我的这一段时间。假设我做了扩展方法,按日期对项目列表进行分组,以便更改可能的分组,以便可以按日,周或月分组结果。LINQ to SQL - 按日/周/月集团

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

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

我假设使用的查询中的函数功能的原因造成的错误,是有可能产生这样的代码?

P.S.我仍然在试图总结我的周围Func键的头,和表达式:)

回答

3

如若组语法不是:

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

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

你既可以改变你的项目参数是一个IEnumerable,而不是IQueryable的,或者不工作创造你的方法变量(靠近顶部)

var itemsEnumerable = items.AsEnumerable(); 

你也将不得不改变你的返回类型从IQueryable到IEnumerable

+0

我需要在SQL中执行查询。如果我删除泛型和Func参数并将其与类绑定,此查询工作正常,但我需要对多个查询进行通用支持,并且由于性能限制,它必须在SQL中执行。我假设我缺少使查询工作所需的语法糖 – Mig 2011-01-13 12:56:00