2009-10-02 7 views
4

J'essaie d'inclure deux tables hors d'une table de base, et de fournir une instruction "where" sur la deuxième table, mais je reçois une erreur très confuse (ci-dessous). Des idées sur le problème/la solution?Entity Framework Inclure avec où avec 3 tables

ObjectQuery<STATE> productQuery = 
    LeadsContext.STATE.Include("REGION") 
     .Where("it.REGION.BRAND.BRAND_ID = @brand", new ObjectParameter("brand", brand)) 
     .OrderBy("it.STATE_ABBV"); 

table layout de base: ÉTAT ------ ------ RÉGION DE MARQUE

BRAND_ID est BRAND

'MARQUE' est pas un membre de « transitoire .collection [Citizens.Leads.Data.REGION (Nullable = True, DefaultValue =)] '. Pour extraire les propriétés de collections, vous devez utiliser un sous-requête à itérer sur la collection., Près identifiant multipart, ligne 8, colonne 1.

Répondre

6

On dirait que State.REGION est en fait une collection de Region entités.

Dans ce cas, vous ne pouvez pas accéder directement à la navigation BRAND comme cela, car votre instruction tente d'accéder à la propriété BRAND d'une collection plutôt qu'à la propriété BRAND d'un élément de la collection.

Si vous écrivez cette requête en utilisant LINQ aux entités plutôt que des méthodes de constructeur de requêtes, vous pouvez le faire comme ceci:

var productQuery = from s in LeadsContext.State 
        from r in s.REGION 
        where r.Brand.Brand_ID == brand 
        orderby s.STATE_ABBR 
        select s; 

Bien sûr, qui ne serait pas REGION de charge avec impatience (s) de sorte que vous pourriez penser que vous pourrait écrire ceci:

var productQuery = from s in LeadsContext.State.Include("REGION") 
        from r in s.REGION 
        where r.Brand.Brand_ID == brand 
        orderby s.STATE_ABBR 
        select s; 

Mais ça ne marchera pas parce que votre INCLUDE est perdu lorsque vous faites un grand nombre Select (c.-à-from y in z from x in y).

donc vous devez faire Inclure à la fin comme ceci:

var productQuery = (from s in LeadsContext.State 
        from r in s.REGION 
        where r.Brand.Brand_ID == brand 
        orderby s.STATE_ABBR 
        select s) as ObjectQuery<State>).Include("REGION"); 

Voir tip 22 pour en savoir plus sur cette solution de contournement.

Je ne suis pas sûr à 100% que nos méthodes de générateur de requêtes, c'est-à-dire où (chaîne), prennent en charge la sous-sélection de ce qui est requis. Donc, je ne suis pas sûr de ce que la syntaxe serait là-dedans.

Quoi qu'il en soit, j'espère que cela aide

Alex

+0

cela aide une tonne, merci! – CodeMonkey1313

+0

Si quelqu'un a la syntaxe Query Builder qui fonctionne avec la première requête LINQ ici, ce serait très utile. J'essaie juste d'avoir une idée de la différence entre les deux. – CodeMonkey1313

6

Alex, vous pouvez obtenir quelque chose de similaire dans le constructeur de requêtes en abordant différemment la requête. Les supports de générateur de requête existent. La requête ressemblera à quelque chose comme ceci:

 
ObjectQuery productQuery = 
     LeadsContext.STATE.Include("REGION") 
      .Where("EXISTS(SELECT 1 FROM it.REGION.BRAND as b WHERE b.BRAND_ID 
= @brand)", new ObjectParameter("brand", brand)) 
      .OrderBy("it.STATE_ABBV"); 

Questions connexes