0
将复杂的SQL查询转换为linq格式时遇到一些困难。 这里是SQL Server上我原来的SQL查询:如何将SQL查询更改为Linq
select DriverID, DriverName, DriverCode,
count(*),
sum(case IsDelivered when 1 then 1 else 0 end),
sum(case IsDelivered when 0 then 1 else 0 end)
from tb_DriverContractDeliveries where DriverName!='' and DeliveryDate = '20140925' group by DriverID, DriverName, DriverCode , DeliveryDate order by DriverName asc
我为能够将其转换为LINQ查询作为bleow:
var result = (from n in db.tb_DriverContractDeliveries
where n.DriverName != "" && n.DeliveryDate == date
orderby n.DriverName
group n by new { n.DriverID, n.DriverName, n.DriverCode } into g
select new
{
DriverID = g.Key.DriverID,
DriverName = g.Key.DriverName,
DriverCode = g.Key.DriverCode,
Total = g.Count(),
Delivered = g.Count(n => n.IsDelivered.Equals("1")),
Remaining = g.Count(n => n.IsDelivered.Equals("0"))
}).ToList();
不过,我添加了一个新的子查询到SQL语句,它执行的SQL服务器上很好,但我不知道如何将此块转换成LINQ:
select DriverID, DriverName, DriverCode,
count(*),
sum(case IsDelivered when 1 then 1 else 0 end),
sum(case IsDelivered when 0 then 1 else 0 end),
Substring(convert(varchar(30),(select top 1 EstTime from tb_DriverContractDeliveries bar
where
bar.DriverID = tb_DriverContractDeliveries.DriverID
and
bar.DeliveryDate = tb_DriverContractDeliveries.DeliveryDate
and
max(tb_DriverContractDeliveries.DeliveredTime) = bar.DeliveredTime) ,20),12,5)
from tb_DriverContractDeliveries where DriverName!='' and DeliveryDate = '20140925' group by DriverID, DriverName, DriverCode , DeliveryDate order by DriverName asc
我只是我自己得到了这个工作,LINQ查询应该如下:
var results = (from n in db.tb_DriverContractDeliveries
where n.DriverName.Equals("") == false && n.DeliveryDate == DateTime.Today
orderby n.DriverName
group n by new { n.DriverID, n.DriverName, n.DriverCode } into g
select new
{
DriverID = g.Key.DriverID,
DriverName = g.Key.DriverName,
DriverCode = g.Key.DriverCode,
Total = g.Count(),
Delivered = g.Count(n => n.IsDelivered.Equals("1")),
Remaining = g.Count(n => n.IsDelivered.Equals("0")),
EstTime = (from n in db.tb_DriverContractDeliveries
where n.DriverID == n.DriverID && n.DeliveryDate == n.DeliveryDate && g.Max(x => x.DeliveredTime) == n.DeliveredTime
select n.EstTime).FirstOrDefault().ToString()
});
您是否尝试过写'新{}'部内的子查询?考虑到有些功能无法通过EF转换为SQL,所以您必须具有创造力才能避免它们。你可以从包含一个简单的子查询开始,尝试改进它,直到你得到你所需要的。 – JotaBe 2014-09-25 08:07:19
是的,感谢您的评论。我在睡觉之前发布了这个问题,希望有人能为我提供一个答案,因为我一直在为这个项目进行72小时的通关工作,并且只睡了8个小时。但是现在我已经知道了,谢谢你的鼓励。 – 2014-09-25 09:33:45