2014-09-25 82 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对象