2011-12-02 1 views
1

Je fonction suivante dans mon codeLINQ to Entities ne reconnaît pas l'index de tableau

public List<string> GetpathsById(List<long> id) 
     { 

      List<string> paths = new List<string>(); 
      for (int i = 0; i < id.Count; i++) 
      { 

       Presentation press = context.Presentations.Where(m => m.PresId == id[i]).FirstOrDefault(); 
       paths.Add(press.FilePath); 
      } 
      return paths; 
     } 

Mais quand j'essaie cela, compiller obtenir erreur comme ça. Ensuite, j'essaie de faire quelque chose comme ça et tout fonctionne bien.

public List<string> GetpathsById(List<long> id) 
     { 
      long x; 
      List<string> paths = new List<string>(); 
      for (int i = 0; i < id.Count; i++) 
      { 
       x = id[i]; 
       Presentation press = context.Presentations.Where(m => m.PresId == x).FirstOrDefault(); 
       paths.Add(press.FilePath); 
      } 
      return paths; 
     } 

Alors je me demande pourquoi? Je ne peux obtenir aucune réponse pour ce comportement dans mon esprit. Quelqu'un peut-il expliquer ce paradoxe?

Répondre

2

Il n'y a pas de magie: les arbres d'expression sont traduits en requêtes SQL, ce que les bases de données relationnelles comprennent. Vous pouvez faire presque n'importe quoi dans un arbre d'expression. Malheureusement, toutes les opérations ne sont pas implémentées. Considérez l'exemple suivant:

Presentation press = context 
    .Presentations 
    .Where(m => SomeCustomFunctionThatUsesUnmanagedPInvokeCode(m.PresId)) 
    .FirstOrDefault(); 

À quoi pensez-vous que la requête SQL générée soit?

C'est le cas des indexeurs de tableaux. Ils ne peuvent pas être traduits en requêtes SQL.

Cela dit, dans votre cas, ce qui suit pourrait être un peu plus simple:

public List<string> GetpathsById(List<long> id) 
{ 
    return 
     (from p in context.Presentations 
     where id.Contains(p.PresId) 
     select p.FilePath 
     ).ToList(); 
} 

La méthode .Contains sera traduit dans une clause SQL IN. Cela évite d'envoyer plusieurs requêtes SQL à la base de données comme vous le faites dans votre exemple à chaque itération.

+0

Je le pense aussi ... –

+0

Merci ... Mais ne peut-il traduire simplement la valeur de cet index en SQL? –

+0

Incroyable ... Et pourquoi 'Contient' fonctionne? –

1

Cette question a été posée par un autre utilisateur il doit s'agir d'une école.

Fondamentalement, j'ai donné cette même réponse à l'autre utilisateur.

Il ne peut pas être mappé à un type ou à une fonction SQL.

Tout ce que vous voulez faire dans ce code peut être fait simplement en utilisant la liste et en l'itérant de manière légèrement différente.

Le bit de code suivant fera tout ce dont vous avez besoin.

public List<string> GetpathsById(List<long> id) 
{ 
    List<string> paths = new List<string>(); 
    foreach(long aa in id) 
    { 
     Presentation press = context.Presentations.Where(m => m.PresId == aa).FirstOrDefault(); 
     paths.Add(press.FilePath); 
    } 
    return paths; 
} 
+0

Est-ce la même réponse qui est dans ce sujet? http://stackoverflow.com/questions/8353948/the-linq-expression-node-node-type-arrayindex-is-not-supported-in-linq-to-entities –

+0

Oui, vous avez tous deux un code très similaire et un similaire question. –

Questions connexes