결과를 얻으려는 테이블이 5 개 있습니다. 아래는 내 테이블 디자인입니다.
응용 프로그램 및 환경 테이블 :
Id, Name
참고-위의 표는 모두 동일한 속성을 갖습니다.
ResourceGroup 테이블 :
Id, Name, Application_Id
ResourceGroupEnvironment 테이블 :
Id, ResourceGroup_Id, Environment_Id, VIP, URL
서버 테이블 :
Id, ServerName, Alias, IPAddress, Network
ServerResourceGroup 테이블 :
Id, Server_Id, ResourceGroup_Id, Environment_Id
어떤 결과를 얻으려고합니까?
위의 테이블 디자인을 기반으로 테이블 ResourceGroup
및 Application
테이블의 일부인 모든 서버를 가져올 것으로 예상 합니다. ResourceGroupEnvironment
및 ServerResourceGroup
테이블 공유 environment
표는 ResourceGroupEnvironment
하나의 공통 환경을해야하지만 ServerResourceGroup
그 환경에서 여러 서버를 가질 수 있습니다.
그래서 , 에 ResourceGroupEnvironment
가입하려고 했지만 서버에 대한 중복 항목이 있지만 각 항목은 다른 및 . 예제는 JSON의 중복 레코드 아래를 참조하십시오.VIP
URL
servers
vip
URL
{
"serverId": 1,
"applicationName": "TestApp",
"resourceName": "Test AppFabric",
"serverName": "Server1",
"aliasName": null,
"os": "Windows Server 2008",
"ipAddress": "192.168.1.1",
"vip": "10.1.1.1",
"url": "www.google.com",
"environmentName": "DEV",
},
{
"serverId": 1,
"applicationName": "TestApp",
"resourceName": "Test AppFabric",
"serverName": "Server1",
"aliasName": null,
"os": "Windows Server 2008",
"ipAddress": "192.168.1.1",
"vip": "10.2.2.3",
"url": "www.testui.com",
"environmentName": "DEV",
}
그렇다면 JSON의 위 레코드에 어떤 문제가 있습니까?
글쎄, 나는 데이터베이스에서 하나의 레코드를 다시 가져와야 environment
합니다. DEV
환경에 여러 서버가있는 경우 여러 서버를 반환해야하지만 각 서버 레코드에 가입 VIP
하고 참여해야 URL
합니다. 당신은 통지, 경우 VIP
그리고 URL
그들은 두 개의 서로 다른 환경에 속하는, 독특합니다. 이러한은 10.1.1.1 VIP
에 속하는 DEV
환경과 10.2.2.3
다른 환경에 속한다 PROD
.
예외로 작동하지 않는 linq에서 작성한 쿼리는 다음과 같습니다.
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.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,
resourceName = rg.Name,
applicationName = a.Name,
serverName = s.ServerName,
aliasName = s.Alias,
os = o.OSVersion,
ipAddress = s.IPAddress,
vip = lrge.VIP,
url = lrge.EndPointURL,
domain = d.Name,
network = n.Name,
typeName = t.Name,
environmentName = e.Name,
status = stat.Name
};
return query.ToList();
SQL 쿼리 :
내 자신의 SQL 쿼리를 작성하면 제대로 작동하고 올바른 레코드를 제공합니다. 아래 SQL 쿼리를 참조하십시오.
select rg.Name as ResourceName, s.ServerName, rge.VIP, rge.EndPointURL
from ResourceGroup as rg
join ServersResourceGroup as srg on rg.Id = srg.ResourceGroup_id
join Servers as s on srg.Server_id = s.Id
left join ResourceGroupEnvironment as rge on srg.Environment_id = rge.Environment_id
모든 사람의 도움을받은 후에 작동 한 솔루션은 다음과 같습니다.
var query = from rg in _context.ResourceGroup
join srg in _context.ServersResourceGroup on rg.Id equals srg.ResourceGroup_id
join s in _context.Servers on srg.Server_id equals s.Id
join a in _context.Applications on rg.Application_Id equals a.Id
join e in _context.Environments on srg.Environment_id equals e.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 n in _context.NetworkZones on s.NetworkZone_Id equals n.Id
join o in _context.OperatingSystems on s.OperatingSystem_Id equals o.Id
join stat in _context.Status on s.Status_Id equals stat.Id
join rge in _context.ResourceGroupEnvironment on srg.Environment_id equals rge.Environment_id into lrges
from lrge in lrges.DefaultIfEmpty()
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();
귀하의 쿼리
SELECT rg.Name AS ResourceName, s.ServerName, rge.VIP, rge.EndPointURL
FROM ResourceGroup AS rg
JOIN ServersResourceGroup AS srg ON rg.Id = srg.ResourceGroup_id
JOIN Servers AS s ON srg.Server_id = s.Id
LEFT JOIN ResourceGroupEnvironment AS rge ON srg.Environment_id = rge.Environment_id
이 Linq 문으로 번역 할 수 있습니다.
var query = from rg in _context.ResourceGroup
join srg in _context.ServersResourceGroup on rg.Id equals srg.ResourceGroup_id
join s in _context.Servers on srg.Server_id equals s.Id
from rge in _context.ResourceGroupEnvironment.Where(x => srg.Environment_id = x.Environment_id).DefaultIfEmpty()
select new{
ResourceName = rg.Name,
s.ServerName,
rge.VIP,
rge.EndPointURL
};
var queryResults = query.ToList();
다시 사과와 사과를 비교해야합니다. 쿼리에서 11 개의 테이블을 조인하고 where
있고 다른 결과의 원인이 될 수있는 예제 쿼리에서 모두 생략 된 절이 있습니다. 귀하의 의견에 따라이 답변은 SQL 스크립트에 포함 된 4 개의 테이블에 중점을 둡니다.
마지막 (외부) 조인 정보 : LINQ by LINQ의 LEFT OUTER JOIN 질문에 대한 답변을 참조하세요 @Stefan Steiger
. 이것은 구문 IMO를 읽기가 더 쉽지만 구문을 사용하는 방법 또는 다른 방법 join
이 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다