SQL"WHERE IN"查询转换为LINQ [英] SQL "WHERE IN" query conversion to LINQ

查看:209
本文介绍了SQL"WHERE IN"查询转换为LINQ的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试找到一种将这种非常复杂的SQL查询转换为LINQ的方法,而我似乎无法解决所有嵌入的"WHERE IN"子句.有人会友好地帮助我吗?

I'm trying to find a way to convert this very complex SQL Query into LINQ and I can't seem to tackle all the embedded "WHERE IN" clauses. Would someone be so kind as to lend me a helping hand?

这是SQL代码(不用担心存储过程,它是行总数的计数)

Here is the SQL code (don't worry about the stored procedure, it's a count of a row total)

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)
                            })

    });

推荐答案

您可以使用任何

包含

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)

这篇关于SQL"WHERE IN"查询转换为LINQ的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆