2009-06-30 7 views
1

j'ai un problème avec LINQ, je vais vous expliquer sur exemple:LINQ à l'entité Contient() et les requêtes imbriquées

j'ai une table de base de données appelée employé qui a FirstName et colonnes LastName, et une méthode pour les employés de la recherche qui obtient une liste de nameList comme argument, les éléments de cette liste sont des noms formatés comme celui-ci « Fred Graver » ou cela1 « Grim Reaper », déjà tryed ces approches sans chance = [

//just all employees 
var allData = from emp in Context.Employee select emp; 

var test1 = from emp in allData 
      where(emp.FirstName + " " + emp.LastName).Contains 
      ("" + ((from n in nameList select n).FirstOrDefault())) 
      select emp; 

var test2 = (from emp in allData 
      where (emp.FirstName + " " + emp.LastName) 
      == ((from n in nameList select n).FirstOrDefault()) 
      select emp); 

var test3 = from emp in allData 
      where (from n in nameList select n).Contains 
      (emp.FirstName + " " + emp.LastName) 
      select emp; 

Les première et deuxième requêtes donnent: {"Impossible de créer une valeur constante de type 'Type de fermeture'. Seuls les types primitifs ('suc et h comme Int32, String et Guid ') sont pris en charge dans ce contexte. "} exception

et troisième: {" LINQ to Entities ne reconnaît pas la méthode' Boolean Contient [String] (System.Collections.Generic.IEnumerable`1 [System.String], System.String) » méthode, et cette méthode ne peut pas être traduit en une expression de magasin."}

serait heureux d'entendre vos suggestions :)

Thank you!



p.s.
Oui, je sais qu'il est possible de diviser les noms dans la liste et de les comparer séparément, mais toujours curieux de savoir pourquoi ces requêtes fonctionnent.

Répondre

2

Je suppose que nameList est dans ce cas une collection en mémoire et que vous essayez d'utiliser l'astuce LINQ to SQL en créant une clause SQL "IN" dans Entity Framework. Malheureusement, EF ne prend pas encore en charge cette syntaxe. Selon le nombre d'enregistrements que vous essayez de faire correspondre, vous pouvez exécuter des requêtes distinctes pour chaque enfant que vous souhaitez. Vous pouvez également créer une requête entitysql à l'aide de la concaténation pour ajouter les éléments multiples de nameList en tant que clauses OR distinctes dans l'opération WHERE.