2011-02-23 5 views
2

Im en utilisant EF (edmx pas coder en premier) et je veux rejoindre un sp à une table « normale » donc j'utiliser la requête LINQ suivante:Comment rejoindre sp à la table Linq

var test = (from obj1 in e.myTable 
      join obj2 in e.MySp(aString) on obj1.AStringProperty equals obj2.AStringProperty 
      select r.description).ToList(); 

qui jette ensuite NotSupportedException avec le message suivant:

Unable to create a constant value of type 'Api.DataAccess.Contexts.MySp_Result'. Only primitive types ('such as Int32, String, and Guid') are supported in this context. 

Mais tout ce que je suis de l'établissement à se joindre sont une chaîne de sorte que la seule chose que je peux supposer est que le fait que l'objet généré est retourné par le sp a un int? et un long? provoque cette erreur? Si oui, comment pourrais-je contourner cela?

Merci

Répondre

1

Vous ne pouvez pas joindre des procédures stockées dans SQL (LINQ génère SQL), utiliser une fonction définie par l'utilisateur à la place.

0

peut vous essayez ceci:

var test = (from obj1 in e.myTable 
      from obj2 in e.MySp(aString) 
      where obj1.AStringProperty == obj2.AStringProperty 
      select r.description).ToList(); 
+0

ne peut pas voir comment cela aiderait. – Magnus

0

Ce n'est pas possible EF, ainsi que dans SQL. La requête Linq-to-entities est traduite en SQL. Vous ne pouvez pas joindre le jeu de résultats de SP à une autre requête.

La seule voie possible est:

var test = (from obj1 in e.myTable.ToList()    
      join obj2 in e.MySp(aString) on obj1.AStringProperty equals obj2.AStringProperty    
      select r.description).ToList(); 

Mais il sera exécuté comme Linq à objets de sorte que le contenu de myTable sera transféré à l'application ainsi que l'ensemble jeu de résultats mySp et rejoindre sera effectué en mémoire.