2016-06-09 1 views
0

J'utilise des requêtes dans EF4 pour retirer des enregistrements et traiter des informations par d'autres moyens (non EF) basés sur les données à l'intérieur, donc j'ai fréquemment détaché les objets EF dans les listes.Entity Framework 4 entité associée ne charge pas

Dans ce cas, j'ai une requête dans EntityFramework 4.0 qui ne charge pas une entité associée, même si j'utilise la méthode .Include ("..."). Est-ce que quelqu'un peut m'aider à comprendre pourquoi le client ne charge pas, même si je déclare explicitement l'inclure?

+0

Qu'est-ce que 'batchSize'? Lorsque vous franchissez la boucle 'foreach', pouvez-vous voir combien d'enregistrements vous avez et pouvez-vous voir des valeurs? –

+0

batchSize est un int qui est remis à la fonction beaucoup plus tôt. – Jerry

Répondre

0

J'ai trouvé la racine du problème! Le démon se trouve dans la commande "let". Chaque fois que j'ai un let, ou une seconde clause "from" (comme une jointure), alors le ".Includes" est ignoré !!!

// -- THIS FAILS TO RETRIEVE CUSTOMER 
// Get the first X records that need to be processed 
var q = (from t in ctx.DBTables 
      .Include("Customer") 
     // Using a "let" like this or 
     let c = t.Customer 
     // a "from" like this immediately causes my include to be ignored. 
     from ca in c.CustomerAddresses 
     where t.statusID == (int)Enums.Status.PostProcessing 
     && c.isActive == true 
     && ca.ValidAddress == true 
     select t 
     ).Take(batchSize).ToList(); 

Cependant, je peux aller chercher les ID que je dois chercher dans un appel, une seconde instance « aller chercher mon comprend » appel, et tout fonctionne très bien.

// Get the first X record IDs that need to be processed 
var q = (from t in ctx.DBTables 
     let c = t.Customer 
     from ca in c.CustomerAddresses 
     where t.statusID == (int)Enums.Status.PostProcessing 
     && c.isActive == true 
     && ca.ValidAddress == true 
     select t.TableID 
     ).Take(batchSize).ToList(); 

// Now... go "deep-load" the records I need by ID 
var ret = (from t in ctx.DBTables 
      .Include("Customer") 
      where q.Contains(t.TableID) 
      select t);