Pourquoi Entity Framework ne pourrait-il pas utiliser ToString () dans une instruction LINQ?

c# entity-framework linq linq-to-sql

Question

Cela fonctionne dans LINQ-to-SQL:

var customersTest = from c in db.Customers
                select new
                {
                    Id = c.Id,
                    Addresses = from a in db.Addresses where c.Id.ToString() == 
                        a.ReferenzId select a
                };

foreach (var item in customersTest)
{
    Console.WriteLine(item.Id);
}

Mais un exemple similaire dans Entity Framework génère un message d'erreur indiquant qu'il ne peut pas "traduire le document en SQL". Voici le message d'erreur original en allemand:

"'LINQ to Entities' erkennt die Methode 'System.String ToString ()' nicht, and diese Methode kann nicht in einen Speicherausdruck Übersetzt werden."

Traduction:

"'LINQ to Entities' ne reconnaît pas la méthode 'System.String ToString ()', cette méthode ne peut pas être traduite en une expression de mémoire.

Quelqu'un peut-il nous éclairer sur la manière dont nous pourrions obtenir ce type de déclaration dans Entity Framework ou expliquer pourquoi il génère cette erreur?

Réponse populaire

En termes simples, LINQ to Entities ne connaît pas la conversion de votre type d’ID en chaîne.

Quel est le type de c.ID ? Existe-t-il une raison pour laquelle il s'agit d'un type d'ID, mais d'un autre pour ReferenzId ? Si possible, faites-en le même type, vous n'aurez plus de problème. J'ignore s'il existe d'autres moyens d'effectuer des conversions dans LINQ vers des entités, mais il serait plus simple d'aligner les types.

Au fait, cela ressemble vraiment à une jointure:

var query = from c in db.Customers
            join a in db.Addresses on c.Id equals a.ReferenzId into addresses
            select new { Id = c.Id, Addresses = addresses };

EDIT: Pour répondre à votre commentaire - ToString apparaît dans IntelliSense car le compilateur n'a aucune idée réelle de ce que votre requête va signifier ou comment elle sera traduite. C'est parfaitement valide C #, et peut générer un arbre d'expression valide - c'est juste que EF ne sait pas convertir cet arbre d'expression en SQL.

Vous pouvez essayer d’ utiliser Convert.ToString(c.Id) au lieu d’appeler c.Id.ToString() ...



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow