我正在尝试从LINQ中的GroupJoin输出匿名类型,但是一个查询起作用而另一个查询不起作用。
唯一的区别是在第一个查询中,起始service
是一个内存IGrouping(来自之前调用GroupBy的成员),而不是直接数据库查询。
我得到的错误是
错误8方法'System.Linq.Enumerable.GroupJoin的类型参数(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>) '无法从使用中推断出来。尝试显式指定类型参数。 C:\ Users \ wbutt \ Documents \ Visual Studio 2013 \ Projects \ ServiceGraphMonitor \ Controllers \ ServiceQueueController.cs 148 30 ServiceGraphMonitor
这是不起作用的查询:
var result = index.GroupJoin(service.GroupBy(
s => new
{
h = s.orig_que_dt.Hour,
s = s.orig_que_dt.Minute / 15
}
), i => i, s => s.Key,
(i, s) => new
{
x = new DateTime(start_date.Year, start_date.Month, start_date.Day, i.h, i.m * 15, 0),
y = s.Count()
}
);
这个有效:
var result = index.GroupJoin(db.t_svc_task_sta.Where(ts =>
ts.t_svc_task.orig_que_dt > start_date &&
ts.t_svc_task.orig_que_dt < end_date
).GroupBy(ts => new
{
h = ts.t_svc_task.orig_que_dt.Hour,
m = ts.t_svc_task.orig_que_dt.Minute / 15
}
), i => i, ts => ts.Key,
(i, ts) => new // DTO.ServiceReport()
{
time = new DateTime(start_date.Year, start_date.Month, start_date.Day, i.h, i.m * 15, 0).ToUniversalTime(),
queue_time = ts.Sum(t => t.Where(x => x.svc_task_sta_cd == 1 && x.sta_end_dt <= DateTime.Now).DefaultIfEmpty(new t_svc_task_sta() {sta_start_dt = DateTime.Today, sta_end_dt = DateTime.Today }).Average(x => (x.sta_end_dt - x.sta_start_dt).TotalSeconds)),
exec_time = ts.Sum(t => t.Where(x => x.svc_task_sta_cd == 2 && x.sta_end_dt <= DateTime.Now).DefaultIfEmpty(new t_svc_task_sta() {sta_start_dt = DateTime.Today, sta_end_dt = DateTime.Today }).Average(x => (x.sta_end_dt - x.sta_start_dt).TotalSeconds)),
volume = ts.Sum(t => t.Count(x => x.svc_task_sta_cd == 1))
}
);