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