web-dev-qa-db-fra.com

LINQ to Entities ne reconnaît pas la méthode "Int32 Parse (System.String)", et cette méthode ne peut pas être traduite en expression de magasin

J'utilise Entity Framework et j'ai une ligne de code qui convertit une variable var en une clé pour la base de données.

var record = context.enrollments.SingleOrDefault
  (row => row.userId == int.Parse(UserID) && row.classId == int.Parse(ClassID));

Chaque fois que j'essaie de l'exécuter, je reçois une erreur rhis. "LINQ to Entities ne reconnaît pas la méthode" Int32 Parse (System.String) ", et cette méthode ne peut pas être traduite en une expression de magasin."

J'ai aussi essayé ça

 var record = context.enrollments.FirstOrDefault
  (row => row.userId == Convert.ToInt32(UserID) 
  && row.classId == Convert.ToInt32(ClassID));

et tout ce que je reçois, c'est ce message d'erreur: "LINQ to Entities ne reconnaît pas la méthode" Int32 ToInt32 (System.String) ", et cette méthode ne peut pas être traduite en expression de magasin.

enfin, j’ai aussi essayé cette méthode, ce qui est inhabituel à mon avis, mais cela a déjà fonctionné dans le passé pour des situations similaires.

var record = context.enrollments.SingleOrDefault
  (row => row.userId == CommonDLL.Sanitize<int>.ConvertType(UserID) 
  && row.classId == CommonDLL.Sanitize<int>.ConvertType(ClassID));

Dans lequel je reçois cette erreur. Comme vous pouvez le constater, j'ai essayé plusieurs choses et rien ne fonctionne. Toute aide serait donc très utile.

10
SinceForever

dans Linq to Entity, vous devez utiliser les méthodes de votre query qui est prise en charge par votre provider pour les convertir en expression tree afin qu'elles s'exécutent sur votre côté Data Base.

tous les fournisseurs doivent prendre en charge certaines méthodes appelées par défaut Canonical Functions ( Read More Here ), et vous pouvez également définir votre user defined function et stored procedure comme edm functions à utiliser dans linq query ( Read More Here ) et ( Here ).

en outre, vous pouvez utiliser des méthodes prises en charge par les fournisseurs et converties en expression tree qui se trouvent dans EntityFunctions et SqlFunctions .

et pour finir sur votre question, vous pouvez convertir UserID et ClassID avant votre requête, comme ceci:

var UID = int.Parse(UserID);
var CID = int.Parse(ClassID);
var record = context.enrollments.SingleOrDefault
    (row => row.userId == UID && row.classId == CID);
18
Amir Sherafatian

Cela fonctionne pour moi:

  var iId = int.Parse(TextBox1.Text);
 var item = db.Items.Where(p => p.ItemID == iId ).FirstOrDefault();

Pour que cela fonctionne, vous devez convertir la valeur de votre zone de texte en dehors de l'expression lambda.

1
John