2016-11-14 1 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 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

Любая помощь действительно оценена.

Спасибо,

Ray

ответ

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

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