我现在已经在这个问题上摸不着头脑了。假设我做了一个扩展方法,按日期对项目列表进行分组,我想更改可能的分组,以便结果可以按日,周或月分组。
我想出了下面的内容,但我一直收到以下错误:
方法'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和表达式:)
答案 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