2014-09-25 73 views
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() 
         }); 
+1

您是否嘗試過寫'新{}'部內的子查詢?考慮到有些功能無法通過EF轉換爲SQL,所以您必須具有創造力才能避免它們。你可以從包含一個簡單的子查詢開始,嘗試改進它,直到你得到你所需要的。 – JotaBe 2014-09-25 08:07:19

+0

是的,感謝您的評論。我在睡覺之前發佈了這個問題,希望有人能爲我提供一個答案,因爲我一直在爲這個項目進行72小時的通關工作,並且只睡了8個小時。但是現在我已經知道了,謝謝你的鼓勵。 – 2014-09-25 09:33:45

回答

1

請參考下面的示例查詢。希望這會對你有用。

var secondselected = (from driver in lst 
         where driver.DriverName != "" && driver.DeliveryDate == Convert.ToDateTime("2014-05-01") 
         group driver by new { driver.DriverID, driver.DriverName, driver.DriverCode , driver.DeliveryDate} into drivergroup 
         select new 
         { 
          DriverID = drivergroup.Key.DriverID, 
          DriverName = drivergroup.Key.DriverName, 
          DriverCode = drivergroup.Key.DriverCode, 
          Total = drivergroup.Count(), 
          Delivered = drivergroup.Count(n => n.IsDelivered.Equals(true)), 
          Remaining = drivergroup.Count(n => n.IsDelivered.Equals(false)), 
          EstTime = (from dr in lst 
          where dr.DriverID == drivergroup.Key.DriverID 
            && dr.DeliveryDate == drivergroup.Key.DeliveryDate 
            && dr.DeliveredTime == drivergroup.Max(n => n.DeliveredTime) 
          select dr.EstTime).ToList().First(1) 





         }).ToList(); 

注:LST是什麼都IEnumerable的對象即tb_DriverContractDeliveries對象