2016-11-14 54 views
0

我在LINQ中编写查询,但遇到从数据库获取正确记录的问题。当我执行LINQ查询时,我得到重复的记录。请参考下面的记录在JSON格式重复结果:问题从LINQ查询中获得正确的结果,请使用LEFT JOIN

[ 
    { 
    "serverId": 1, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric", 
    "serverName": "Server1", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "192.168.1.1", 
    "vip": "10.1.1.5", 
    "url": "www.testapp.com", 
    "domain": "Domain1", 
    "network": "Internal Harden", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 1, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric", 
    "serverName": "Server1", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "192.168.1.1", 
    "vip": "", 
    "url": "", 
    "domain": "Domain1", 
    "network": "Internal Harden", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 2, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric", 
    "serverName": "Server2", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "192.168.1.2", 
    "vip": "10.1.1.5", 
    "url": "www.testapp.com", 
    "domain": "Domain1", 
    "network": "Internal Harden", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 2, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric", 
    "serverName": "Server2", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "192.168.1.2", 
    "vip": "", 
    "url": "", 
    "domain": "Domain1", 
    "network": "Internal Harden", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 3, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric UI", 
    "serverName": "Server3", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "172.16.1.1", 
    "vip": "", 
    "url": "", 
    "domain": "Domain2", 
    "network": "DMZ 1", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 3, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric UI", 
    "serverName": "Server3", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "172.16.1.1", 
    "vip": "10.1.1.6", 
    "url": "www.testappui.com", 
    "domain": "Domain2", 
    "network": "DMZ 1", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 4, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric UI", 
    "serverName": "Server4", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "172.16.1.2", 
    "vip": "", 
    "url": "", 
    "domain": "Domain2", 
    "network": "DMZ 1", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 4, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric UI", 
    "serverName": "Server4", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "172.16.1.2", 
    "vip": "10.1.1.6", 
    "url": "www.testappui.com", 
    "domain": "Domain2", 
    "network": "DMZ 1", 
    "typeName": "Application", 
    "environmentName": "DEV", 
    "status": "Active" 
    }, 
    { 
    "serverId": 1002, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric", 
    "serverName": "Server5", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "10.1.1.5", 
    "vip": "", 
    "url": "", 
    "domain": "Domain1", 
    "network": "Internal Harden", 
    "typeName": "Application", 
    "environmentName": "INT", 
    "status": "Active" 
    }, 
    { 
    "serverId": 1003, 
    "applicationName": "TestApp", 
    "resourceName": "Test AppFabric", 
    "serverName": "server6", 
    "aliasName": null, 
    "os": "Windows Server 2008", 
    "ipAddress": "10.1.1.6", 
    "vip": "", 
    "url": "", 
    "domain": "Domain1", 
    "network": "Internal Harden", 
    "typeName": "Application", 
    "environmentName": "INT", 
    "status": "Active" 
    } 
] 

这里是我用我的ASPT.NET核心应用查询:

var query = from rg in _context.ResourceGroup 
    join sr in _context.ServersResourceGroup on rg.Id equals sr.ResourceGroup_id 
    join rge in _context.ResourceGroupEnvironment on sr.Environment_id equals rge.Environment_id into lrges 
    from lrge in lrges.Where(r => r.ResourceGroup_id == sr.ResourceGroup_id).DefaultIfEmpty() 
    join s in _context.Servers on sr.Server_id equals s.Id 
    join e in _context.Environments on sr.Environment_id equals e.Id 
    join a in _context.Applications on rg.Application_Id equals a.Id 
    join d in _context.Domains on s.Domain_Id equals d.Id 
    join t in _context.Types on rg.Type_Id equals t.Id 
    join o in _context.OperatingSystems on s.OperatingSystem_Id equals o.Id 
    join n in _context.NetworkZones on s.NetworkZone_Id equals n.Id 
    join stat in _context.Status on s.Status.Id equals stat.Id 
    where a.Name.ToLower() == applicationName.ToLower() 
    select new SearchListViewModel() 
    { 
     serverId = s.Id, 
     serverName = s.ServerName, 
     aliasName = s.Alias, 
     domain = d.Name, 
     environmentName = e.Name, 
     network = n.Name, 
     os = o.OSVersion, 
     ipAddress = s.IPAddress, 
     vip = lrge == null ? string.Empty : lrge.VIP, 
     url = lrge == null ? string.Empty : lrge.EndPointURL, 
     typeName = t.Name, 
     applicationName = a.Name, 
     resourceName = rg.Name, 
     status = stat.Name 
    }; 

return query.ToList(); 

而且,这里是原生SQL查询,只是工作正常。

SELECT s.ServerName, rg.Name as ResourceGroup, e.Name as Env, 
rge.EndPointURL, rge.VIP 
FROM ResourceGroup as rg 
JOIN ServersResourceGroup as srg on rg.Id = srg.ResourceGroup_id 
JOIN Servers as s on srg.Server_id = s.Id 
JOIN Environments as e on srg.Environment_id = e.Id 
LEFT JOIN ResourceGroupEnvironment as rge on srg.Environment_id = rge.Environment_id and rg.Id = rge.ResourceGroup_Id 

不知道如果我的LINQ查询是错的,但我试图完成上述在LINQ本地查询,

这里是我的实体模型,以帮助了解需求:

enter image description here

任何帮助真的很感激。

谢谢

回答

1

首先,我没有看到任何重复你的结果(每一个“结果集”是不同的)。

现在,在左连接中使用了一个Where子句,在左连接的项目中出现了一些奇怪现象。

join rge in _context.ResourceGroupEnvironment on sr.Environment_id equals rge.Environment_id into lrges 
from lrge in lrges.Where(r => r.ResourceGroup_id == sr.ResourceGroup_id).DefaultIfEmpty() 

我宁愿做(用new

join rge in _context.ResourceGroupEnvironment on new{sr.Environment_id, sr.ResourceGroup_id} equals new{ rge.Environment_id, rge.ResourceGroup_id} into lrges 
from lrge in lrges.DefaultIfEmpty() 
+0

它的工作联接使用多个条件。我正在寻找几天来找出如何使用多个条件,现在它是有道理的。非常感谢你。 :) – Ray