2011-10-11 2 views
1

Я пытаюсь найти способ преобразования этого очень сложного SQL-запроса в LINQ, и я не могу решить все вложенные предложения WHERE IN. Кто-нибудь будет так добр, чтобы одолжить мне руку помощи?Преобразование запросов SQL «WHERE IN» в LINQ

Вот код SQL (не беспокойтесь о хранимой процедуре, это подсчет общего ряда)

SELECT  
    (SELECT pac.Name FROM Account pac WHERE pac.AccountID = AC.ParentAccountID) AS ParentAccountName, 
    ac.Name, dv.DeviceID, dv.Manufacturer, dv.Model, dv.SerialNr, dv.PrinterIPAddress, 
    (SELECT TOP 1 au.AuditDate FROM PrinterAudit pa WITH (NOLOCK) INNER JOIN Audit au ON au.AuditID = pa.AuditID 
     WHERE pa.DeviceID=dv.DeviceID 
     ORDER BY AuditDate DESC) AS AuditDate, 
    dbo.Get_TotalPageCountByDeviceId(DATEADD(month, -3, GETDATE()), GETDATE(), dv.DeviceID) as TotalUsageLast3Months 
FROM Account ac WITH (NOLOCK) 
      INNER JOIN Device dv ON ac.AccountID = dv.AccountID 
WHERE dv.AccountID IN 
      (SELECT au.AccountID FROM Audit au WHERE au.AuditDate >= DATEADD(month, -3, GETDATE())) 
      AND (dv.Manufacturer + dv.Model) IN 
       (SELECT (dv2.Manufacturer + dv2.Model) 
       FROM Device dv2 
       WHERE dv2.AccountID = dv.AccountID 
       AND dv2.Manufacturer = dv.Manufacturer 
       AND dv2.Model = dv.Model 
       AND (dv2.ERPEquipID IS NOT NULL OR dv2.ERPData IS NOT NULL)) 
       AND dv.ERPEquipID IS NULL AND dv.ERPData IS NULL 
       AND dv.DeviceID IN 
       (SELECT pa.DeviceID 
       FROM PrinterAudit pa WITH (NOLOCK) 
       INNER JOIN Audit au ON au.AuditID = pa.AuditID 
       WHERE au.AuditDate >= DATEADD(month, -3, GETDATE())) 
ORDER BY ParentAccountName, ac.Name 

Конечный результат:

var result = 
    (from dv in Device 
    where Audit.Any(au => au.AuditDate >= DateTime.Now.AddMonths(-3) 
     && au.AccountID == dv.AccountID) 
    where Device.Any(dv2 => dv2.AccountID == dv.AccountID 
     && dv2.Manufacturer == dv.Manufacturer 
     && dv2.Model == dv.Model 
     && (dv2.ERPEquipID != null || dv2.ERPData != null) 
     && dv.ERPEquipID == null 
     && dv.ERPData == null 
     && PrinterAudit.Any(pa => pa.Audit.AuditDate >= DateTime.Now.AddMonths(-3) && pa.DeviceID == dv.DeviceID)) 
    orderby dv.Account.ParentAccountID, dv.Account.Name 
    select new 
    { 
     ParentAccountName = Account.Where(pac => pac.AccountID == dv.Account.ParentAccountID).Select(pac => pac.Name), 
     Name = dv.Account.Name, 
     DeviceID = dv.DeviceID, 
     Manufacturer = dv.Manufacturer, 
     Model = dv.Model, 
     SerialNumber = dv.SerialNr, 
     PrinterIPAddress = dv.PrinterIPAddress, 
     AuditDate = (from pa in PrinterAudit where pa.DeviceID == dv.DeviceID orderby pa.Audit.AuditDate descending select pa.Audit.AuditDate).Take(1), 
     TotalUsageLast3Months = (from p in PrinterAudit 
          where p.DeviceID == dv.DeviceID 
          group p by p.DeviceID into total 
          select new 
          { 
           Total = Get_TotalPageCountByDeviceId(DateTime.Now.AddMonths(-3), DateTime.Now, dv.DeviceID) 
          }) 

    }); 
+0

возможно дубликат [Как сделать WHERE ... IN ... в пункте LinqToSql?] (Http://stackoverflow.com/questions/317606/ how-to-do-a-where-in-clause-in-linqtosql) – jrummell

+0

проблема с примерами, и я пытаюсь разобраться в этом около месяца, заключается в том, что у всех их есть только одно предложение WHERE IN , У меня 3 вложенных. Вот где большая часть путаницы. – GenXisT

+0

Я ответил на исходный ответ, когда он направил меня в правильном направлении, и мой результирующий набор теперь достаточно корректен. спасибо за быстрый и точный ответ. – GenXisT

ответ

3

Вы конвертируете оператор SQL IN чтобы с помощью LINQ либо Contains или Any

Содержит

from dv in db.Device 
where 
    (from au in db.Audit 
    where au.AuditDate >= DateTime.Now.AddMonths(-3) 
    select au.AccountID).Contains(dv.AccountID) 

Любой

from dv in db.Device 
where 
    db.Audit.Any(au => au.AuditDate >= DateTime.Now.AddMonths(-3) && 
       au.AccountID == dv.AccountID) 
+0

Это было описано в блоге Meta-Me, см. Https://blogs.msdn.microsoft.com/alexj/2009/03/25/tip-8-how-to-write-where-in-style-queries-using -linq к лицам / –

Смежные вопросы