2016-11-14 9 views
0

LINQでクエリを作成していますが、データベースから正しいレコードを取得できません。 LINQクエリを実行すると、重複したレコードが取得されます。 JSON形式での重複した結果を持つレコードは、以下を参照してください:ここではLEFT JOINを使用してLINQクエリから正しい結果を取得する問題

[ 
    { 
    "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 Coreアプリケーションで使用していますクエリです:

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節を使用して、左結合に奇妙なことがあります。それは働いていた私はむしろ(newを使用して)複数の条件を使用して参加するんだろう

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

関連する問題