2010-04-10 3 views
0

여러 연결된 테이블 (엔티티)이 있습니다. 나는 다음과 같은 LINQ를 사용하여 엔티티를 얻으려고 :Linq : 연결된 개체가 null 인 이유는 무엇입니까?

ObjectQuery<Location> locations = context.Location; 
ObjectQuery<ProductPrice> productPrice = context.ProductPrice; 
ObjectQuery<Product> products = context.Product; 
IQueryable<ProductPrice> res1 = from pp in productPrice 
        join loc in locations 
        on pp.Location equals loc 
        join prod in products 
        on pp.Product equals prod 
        where prod.Title.ToLower().IndexOf(Word.ToLower()) > -1 
        select pp; 

이 쿼리는이 개 기록 오브젝트의 위치와 제품을 연결 한 ProductPrice 객체를 반환하지만 그들은 null이 나는 이유를 이해할 수 없다. 나는 아래로 LINQ에서 그들을 채우기 위해 시도하는 경우 :

res = 
       from pp in productPrice 
       join loc in locations 
       on pp.Location equals loc 
       join prod in products 
       on pp.Product equals prod 
       where prod.Title.ToLower().IndexOf(Word.ToLower()) > -1 
       select new ProductPrice 
       { 
        ProductPriceId = pp.ProductPriceId, 
        Product = prod 
       }; 

나는 예외 "엔티티 또는 복합 형 'PBExplorerData.ProductPrice'엔티티는 쿼리에 대한 LINQ에 건설 될 수 없다"가 은 누군가가 설명해 주시겠습니까 무슨 일이 일어나고 내가해야 할 일이 있습니까? 감사합니다.

답변

0

검색어에 포함 ("")을 추가해야하기 때문에 첫 번째 질문에 대한 대답은 null입니다.

IQueryable<ProductPrice> res1 = from pp in 
       productPrice.Include("Location").Include("Product") 
        join loc in locations 
        on pp.Location equals loc 
        join prod in products 
        on pp.Product equals prod 
        where prod.Title.ToLower().IndexOf(Word.ToLower()) > -1 
       select pp; 

두 번째 문제는 EF가 쿼리를 아래로 밀어 시도하고 ProductPrice는 (실체없는) 그래서 할 수없는 것입니다. 당신이 원하는 경우이 그래서 그냥

  select new 
      { 
       ProductPriceId = pp.ProductPriceId, 
       Product = prod 
      }; 

을 익명 타입으로 변환 그리고

  res.ToList().ConvertAll(x=new ProductPrice() { 
       ProductPriceId = x.ProductPriceId , 
       Product = x.Product 

      }); 

을 또는 당신은 당신이 원하는 엔티티를 선택하고 바로 채워, 그것을 다른 방법을 할 수 조작.

+0

솔루션을 제공해 주셔서 감사합니다. 귀하의 솔루션이 나를 위해 최선을 다하지는 않지만 (지연된로드를 사용하는 것을 선호하지만) 검색 할 위치와 검색 할 위치를 이해할 수있었습니다. 필자는 기본 엔티티에서 EntityReference의 Load() 메소드를 사용하여 지연된로드를 수행 할 수 있음을 발견했습니다. – mimic

관련 문제