【问题标题】:SQL server where clause equals instead of IN [duplicate]SQL Server where子句等于而不是IN [重复]
【发布时间】:2017-04-14 12:10:31
【问题描述】:

这是从 LINQ 生成的 T-SQL

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Name] AS [Name]
    FROM [dbo].[Hospital] AS [Extent1]
    WHERE ( EXISTS (SELECT 
        1 AS [C1]
        FROM ( SELECT 
            [Extent2].[ID] AS [ID]
            FROM [dbo].[HospitalDepartment] AS [Extent2]
            WHERE [Extent1].[ID] = [Extent2].[HospitalID]
        )  AS [Project1]
        WHERE  EXISTS (SELECT 
            1 AS [C1]
            FROM ( SELECT 
                [Extent3].[ID] AS [ID]
                FROM [dbo].[Unit] AS [Extent3]
                WHERE [Project1].[ID] = [Extent3].[HospitalDepartmentID]
            )  AS [Project2]
            WHERE  EXISTS (SELECT 
                1 AS [C1]
                FROM [dbo].[Device] AS [Extent4]
                WHERE ([Project2].[ID] = [Extent4].[UnitID]) AND ([Extent4].[DeviceTypeID] IN (10,20))
            )
        ) 

我需要在下面的代码中使用 equal 而不是 IN,因为当我使用 IN 时,如果它 包含 10 或 20,它会返回结果,但我想要的是如果它 完全等于 10和20

WHERE  EXISTS (SELECT 
            1 AS [C1]
            FROM [dbo].[Device] AS [Extent4]
            WHERE ([Project2].[ID] = [Extent4].[UnitID]) AND ([Extent4].[DeviceTypeID] IN (10,20))
        )

这里是 Linq 源代码:

    var query = db.Hospitals.AsQueryable();


    if (DeviceTypeIDs != null)
    {

     IEnumerable<Guid> selectedDeviceTypeIDs = DeviceTypeIDs.Split(',').Select(Guid.Parse).AsEnumerable();
       query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units.Any(m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID)))));
    }

    if (UnitTypeID != null)
    {
        query = query.Where(j => j.HospitalDepartments.Any(www => www.Units.Any(u => u.UnitTypeID == UnitTypeID)));
    }

    if (DirectorateOfHealthID != null)
    {
        query = query.Where(h => h.DirectorateHealthID == DirectorateOfHealthID);
    }


    query = query.Where(j => j.HospitalDepartments.Any(u => u.Units.Any(d => d.Devices.Any(s => s.Status == Enums.DeviceStatus.Free)))
    && j.HospitalDepartments.Any(hd => hd.Units.Any(u => u.Beds.Any(b => b.Status == Enums.BedStatus.Free))));





    var list = query.ToList();

谢谢

【问题讨论】:

  • IN 更改为= 不会解决此问题。
  • 不能满足条件“正好等于 10 AND 20”。向我们展示 LINQ 源代码和预期结果,以便我们了解您需要实现的目标。
  • AND ([Extent4].[DeviceTypeID] = 10,20) or ([Extent4].[DeviceTypeID] = 20)
  • AND ([Extent4].[DeviceTypeID] = 10 OR Extent4].[DeviceTypeID] =20))
  • 无论如何,添加 c# linq 源代码。显示生成的查询几乎没有价值。我不希望这里有人愿意对 LINQ 的三重嵌套存在进行逆向工程,除非他们也在 puzzling.stackexchange.com 上活跃

标签: c# sql sql-server linq


【解决方案1】:

替换

m =&gt; m.Devices.Any(w =&gt; selectedDeviceTypeIDs.Contains(w.DeviceTypeID))

m =&gt; m.Devices.All(w =&gt; selectedDeviceTypeIDs.Contains(w.DeviceTypeID)) &amp;&amp; selectedDeviceTypeIDs.All(w =&gt; m.Devices.Any(d =&gt; d.DeviceTypeID = w))

你也可以这样重构它:

创建一个方法

private bool areEquivalent(List<int> a, List<int> b) { return (a.Count == b.Count) && !a.Except(b).Any(); }

然后

m =&gt; { var deviceTypes = m.Devices.Select(d =&gt; d.DeviceType).ToList(); return areEquivalent(selectedDeviceTypeIDs, deviceTypes);}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多