【发布时间】:2013-12-02 12:25:14
【问题描述】:
我一直在尝试使用 LINQ 重写以下 SQL 查询,我设法做到了如下:
SQL
select
u.FirstName,
u.ExpectedWeeklyHours,
sum(t.TimeSpent) -- SQL DataType is Time(7)
from dbo.Users u
inner join
dbo.Times t
on u.UserID = t.UserId
group by u.FirstName,
u.ExpectedWeeklyHours
LINQ
using (var data = new DAL())
{
var result =
(from times in data.Times
join users in data.Users on times.UserId equals users.UserID
select new
{
UserName = users.FirstName + " " + users.LastName,
ExpectedHours = users.ExpectedWeeklyHours,
WorkHours = times.TimeSpent
} into x
group x by new
{
UserName = x.UserName,
ExpectedWorkingHours = x.ExpectedHours
}
into g
select new
{
UserName = g.Key.UserName,
ExpectedWorkingHours = g.Key.ExpectedWorkingHours,
TotalWorkingHours = g.Sum(i=>i.WorkHours)
}
).ToList();
}
我的问题是 WorkHours 的类型为:TimeSpan,我收到以下(编译时间)错误:
- 无法将 lambda 表达式转换为类型 'System.Linq.Expressions.LambdaExpression' 因为它不是 委托类型 无法将 lambda 表达式转换为委托类型 'System.Func' 因为一些返回类型 块中的不能隐式转换为委托返回 类型 无法将类型“System.TimeSpan”隐式转换为“int”
如果我将 WorkHours 列(属性)替换为任何其他类型的 int、double 或 decimal,则一切正常。只是Linq的SUM函数不支持TimeSpan!
你能帮忙吗,提前谢谢你..
编辑
根据以下 wuzdik 提出的建议,我来到了这个问题的解决方案,我分享它以帮助有需要的人:
using (var data = new DAL())
{
var result =
(from times in data.Times
join users in data.Users on times.UserId equals users.UserID
select new
{
UserID = users.UserID,
UserName = users.FirstName + " " + users.LastName,
ExpectedHours = users.ExpectedWeeklyHours,
WorkHours = times.TimeSpent
}
into x
group x by new
{
UserId = x.UserID,
UserName = x.UserName,
ExpectedWorkingHours = x.ExpectedHours
}).AsEnumerable().ToList();
var finale = (from p in result
select new TimeModelDashboard
{
UserId = p.Key.UserId,
UserName = p.Key.UserName,
ExpectedWorkingHours = p.Key.ExpectedWorkingHours,
TotalWorkingHours = (decimal) p.Sum(t => t.WorkHours.TotalHours)
}).ToList();
return Json(finale);
}
【问题讨论】: