2010-04-10 2 views
0

У меня есть несколько связанных таблиц (объектов). Я пытаюсь получить объекты с помощью следующей LINQ:Linq: связанные объекты равны нулю, почему?

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; 

Этот запрос возвращает 2 записи, объекты ProductPrice, которые связаны Расположение объекта и продукт, но они равны нулю, и я не могу понять, почему. Если я пытаюсь заполнить их в 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 к Entities запрос» Может кто-то пожалуйста, объясните мне что происходит и что мне нужно делать? Спасибо

ответ

0

Ответ на ваш первый вопрос: «Продукт и местоположение» являются нулевыми, потому что вам нужно добавить Include («») к вашему запросу.

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

Благодарим за решение! Хотя ваше решение не получается лучше для меня (я предпочитаю использовать отложенную загрузку), но это позволило мне понять, где искать и что искать. Я обнаружил, что отложенная загрузка может быть выполнена с использованием метода Load() EntityReference в основном объекте. – mimic

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