우리는 빠른 조인을 위해 1 : 1 관계가 여러 개있는 클래스가 여러 개 있는데 표 형식 디스플레이의 경우 익명 형식에서는 잘 작동하지만 전체를 단일 linq 쿼리에서 유형을 채 웁니다.단일 쿼리에서 Linq-to-SQL로드 1 : 1 관계
우리는 1 : 1로 설정되어 있지 않기 때문에 이러한 속성을 갖거나 모든 디스플레이에 "기본"을 찾기 위해 하위 컬렉션을 쿼리하지 않으려 고합니다. 대신 저장시 이러한 기본 ID를 설정하여 비용이 발생합니다 .
A는이 글의 문맥 예를 벗었 콘택트들의 목록을 표시 할 때
public class Contact
{
public long Id { get; set; }
public EntitySet<Address> Addresses { get; set; }
public EntityRef<Address> PrimaryAddress { get; set; }
public long? PrimaryAddressId { get; set; }
public EntitySet<Email> Emails { get; set; }
public EntityRef<Email> PrimaryEmail { get; set; }
public long? PrimaryEmailId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Address
{
public long Id { get; set; }
public EntitySet<Contact> Contacts { get; set; }
public bool IsPrimary { get; set; }
public string Street1 { get; set; }
public string Street2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
public class Email
{
public long Id { get; set; }
public EntitySet<Contact> Contacts { get; set; }
public bool IsPrimary { get; set; }
public string Address { get; set; }
}
문제는 상기와 PrimaryAddress
PrimaryEmail
로드 지연해야한다. 1 예 : : 그것은 부모의 관계처럼 취급하기 때문에 INNER에서
var DB = new DataContext();
var dlo = new DataLoadOptions();
dlo.LoadWith<Contact>(c => c.PrimaryAddress);
dlo.LoadWith<Contact>(c => c.PrimaryEmail);
DB.LoadOptions = dlo;
var result = from c in DB.Contacts select c;
result.ToList();
위의 코드 결과 가입하세요, 그것은 아무튼 우리가 DataLoadOptions
을 할 경우는 1 이후 중 원하는 효과를 제공하지 않습니다 Nullable FK 관계를 존중하고 1 : 1 속성을 남겼습니다. 인구 1 속성, 심지어 목록 :
Select t1.*, t.2*, t3.*
From Contact t1
Left Join Address t2 On t1.PrimayAddressId = t2.Id
Left Join Email On t1.PrimaryEmailId = t3.Id
이 작업을 수행하고이 널 (NULL) (1)으로 된 IQueryable을 얻을 수있는 방법이 있나요 : 원하는 쿼리는 뭔가 같은 것? 다른 제약으로 인해 유형을 Contact
으로 지정해야하므로 익명 유형이 작동하지 않습니다. 옵션에 매우 개방적이며, 우리가 표시하는 행 수에 대한 지연 쿼리 n * (1 : 1 수) +1 쿼리를 지연로드하는 것보다 낫습니다.
아마도 우리 공급자 (오라클의 dotConnect)에 문제가있을 수 있습니다. 그러나 이것은 여전히 왼쪽 조인 대신 하위 쿼리에서 조인 된 클래스 당 쿼리를 생성합니다 . 당신이 준 예제는 연락처 테이블에 대한 하나의 쿼리로 결과를 얻었고 각 1 : 1 테이블에 대한 결과 당 쿼리는 linq-to-sql에서 왼쪽으로 합쳐진 단일 쿼리를 얻었습니까? –
우리는 SQLServer에 반대하고 있습니다. 위의 쿼리와 유사한 쿼리를 사용하면 코드를 직접 작성하는 것보다 훨씬 복잡하지만 단일 쿼리가 생성되었습니다. dotConnect에 대한 작업 경험이 없지만 표현 방식 트리를 다른 방식으로 처리하고 있으며 SQLServer 공급자와 마찬가지로 하위 쿼리를 생성하지 않는 것으로 보입니다. – RTPeat