2010-04-10 9 views
0

J'ai plusieurs tables liées (entités). Je suis en train d'obtenir les entités utilisant la LINQ suivante:Linq: les objets liés sont null, pourquoi?

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; 

Cette requête renvoie 2 enregistrements, objets productPrice qui ont lié l'objet Lieu et produit, mais ils sont nuls et je ne comprends pas pourquoi. Si je tente de les remplir LINQ comme ci-dessous:

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 
       }; 

Je l'exception « L'entité ou le type complexe « PBExplorerData.ProductPrice » ne peut pas être construit dans un LINQ to Entities requête » Quelqu'un pourrait-il me expliquer s'il vous plaît que se passe-t-il et que dois-je faire? Merci

Répondre

0

La réponse à votre première question le produit et l'emplacement sont nulles parce que vous devez ajouter un Include ("") à votre requête.

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; 

La deuxième question est EF tente de pousser votre requête et ProductPrice (n'est pas une entité) ne peut donc pas. Si vous voulez faire le convertir en un type anonyme si juste faire

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

Et puis faire

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

      }); 

Ou vous pouvez le faire d'autres moyens, en sélectionnant l'entité que vous voulez, et juste peuplant Manuel.

+0

Merci pour la solution! Bien que votre solution ne soit pas la meilleure pour moi (je préfère utiliser le chargement différé) mais cela m'a permis de comprendre où chercher et quoi chercher. J'ai trouvé que le chargement différé peut être fait en utilisant la méthode Load() de l'EntityReference dans l'entité principale. – mimic

Questions connexes