내가 잘 작동하지만, 그것은 생성하는 SQL이 복잡하고 비효율적이기 때문에 내 LINQ 쿼리를 최적화하기 위해 찾고 있어요 ... 기본적으로도움말 LINQ 쿼리
을 최적화하는 데 필요한, 내가 (고객 선택 찾고 CustomerDisplay 개체로) 필요한 제품 (reqdProdId)을 주문하고, 외래 키 CustId와 RegisteredCustomer 테이블의 행으로 저장 신용 카드 번호() 개요로
var q = from cust in db.Customers
join regCust in db.RegisteredCustomers on cust.ID equals regCust.CustId
where cust.CustomerProducts.Any(co => co.ProductID == reqdProdId)
where regCust.CreditCardNumber != null && regCust.Authorized == true
select new CustomerDisplay
{
Id = cust.Id,
Name = cust.Person.DisplayName,
RegNumber = cust.RegNumber
};
에 등록 된 사람은, 고객이 해당하는 사람이있는 이름이있다; PersonID는 Customer 테이블의 외래 키입니다. 생성 된 SQL을 보면 Person 테이블에서 선택된 모든 열을 볼 수 있습니다. Fyi, DisplayName은 Customer.FirstName 및 LastName을 사용하는 확장 메서드입니다. Person에서 열을 어떻게 제한 할 수 있습니까?
둘째로 Anything 절을 없애고 하위 쿼리를 사용하여 필요한 ProductID가있는 다른 모든 CustomerId를 선택하려고합니다. Exists 절을 생성하기 때문입니다. 아시다시피 LINQ는 접합부 테이블과 관련하여 알려진 문제가 있으므로 Cust.CustomerProducts.Products를 수행 할 수 없습니다. 필수 ProductID가있는 junction 테이블의 모든 고객을 선택하려면 어떻게합니까?
도움/조언을 보내 주시면 감사하겠습니다.
thansk Lame Duck, 컴파일 된 LINQ는 생각하지 않았습니다. 그게 좋은 기능 프로그래밍 물건. 또한, 나는 고객과 RegisteredCustomer 사이에 외래 키를 수행하고 (당신이 제안으로) 나는 및 custProd.CreditCardNumber 차이 custProd.Customer.RegisteredCustomer.CreditCardNumber! = null의 사이 가 확실하지 않다! = (I했던 것처럼) LINQ가 custProd를 파악 널 조인의 행이며, SQL이 생성 INNER t1.Id = t2.CustomerID ... ... T2에서 T2로 RegisteredCustomer 가입 .CreditCardNumber IS NOT NULL –
쿼리를 다시 컴파일하십시오. 쿼리는 컴파일 타임이 아니라 런타임에 컴파일됩니다. 컴파일 된 쿼리를 캐시하고 다시 사용할 수 있기 때문에 동일한 쿼리를 여러 번 사용하는 경우에만 도움이됩니다. – Lucas