web-dev-qa-db-fra.com

LINQ to Entities ne reconnaît pas la méthode "Int32 Parse (System.String)" lors de la tentative d'analyse d'une colonne à des fins de comparaison des inégalités

J'ai le code suivant sur ma page:

var myVar= Entity.SetName
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);

start et end sont int, mais p.ID est une chaîne. Je devrais donc convertir p.ID en int. Mais j'obtiens l'erreur suivante:

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

Où est le problème??

16

Tout d'abord, je vous recommande vivement de vérifier la conception de votre base de données pour savoir s'il existe une très bonne raison pour que ID soit string. J'envisagerais de changer le type de base de données ID en int et vous résoudrez ce problème de conversion.

L'erreur que vous obtenez signifie que EF ne sait pas convertir la méthode Int32.Parse() en SQL. En gros, vous avez deux options pour régler ce problème: 

Faites la comparaison en dehors de linq aux entités:

var myVar= Entity.SetName.AsEnumerable()
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);

Mais il s’agit de non recommandé, car vous lisez un jeu de résultats complet à partir de la base de données avant d’appliquer la condition where.

Ou bien créez fonction définie par le modèle personnalisé comme décrit dans cet article sur SO:

Convertir une chaîne en un entier dans EF 4.0 Ou Entity Framework: Où puis-je étendre le CSDL/MSL?

11
mipe34

déplace la fonction d'analyse en dehors de l'expression linq. 

int id = int.Parse(p.ID);
var myVar= Entity.SetName
.Where(p => id >= start && int.Parse(p.ID) <= end);
5
Zubaer Naseem

Commencez par essayer de convertir en int puis transmettez ce nom de variable. 

int catgry = Convert.ToInt32(customercategory.OWNERSHIP_TYPE);
var customerCateg = (from d in _db.tbl_SIL_CUSTOMER_CATEGORY_MST
    .Where(d => d.CAT_ID == catgry) select d.CAT_TYPE).SingleOrDefault();
4
user4536768
private void LoadDetail(int id)
    {
        var sp = from category in db.ProductCategories
                 join product in db.Products on category.ProductCategoryID equals product.ProductCategoryID
                 where id == int.Parse(category.ProductCategoryID)
                 select new
                 {
                     product.ProductID,
                     product.ProductName,
                     product.ProductCode,
                     product.Deception,
                     category.CategoryName,
                     product.Quanrity,
                     product.Price
                 };
        DGVDetail.DataSource = sp.ToList();//help: Error: LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression
    }

    private void DGVMaster_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        int index = e.RowIndex;
        LoadDetail(index + 1);
    } 
0
Quang Hoà