Linq to entities ne reconnaît pas la chaîne.Format ou la concaténation '+'
J'ai code ci-dessous:
using (DBContext context = new DBContext())
{
myCollection = context.Items.Where(i => i.Type == 1).OrderBy(k => k.Name).Select(w => new
{
Alias = w.Name + string.Format("{0}", w.Id),
Name = w.Name
}).ToArray();
}
Lors de l'exécution j'obtiens une erreur lors de la tentative de concaténer les chaînes et en essayant con convertir entier w.Id de chaîne.
D'erreur dit:
Linq to entities ne reconnaît pas la méthode string.Format
également plus de concaténation signe " + " n'est pas pris en charge.
J'ai résolu ce problème en introduisant AsEnumerable:
using (DBContext context = new DBContext())
{
myCollection = context.Items.AsEnumerable().Where(i => i.Type == 1).OrderBy(k => k.Name).Select(w => new
{
Alias = w.Name + string.Format("{0}", w.Id),
Name = w.Name
}).ToArray();
}
mais je voudrais savoir si c'est la meilleure solution ou il y a un autre moyen plus approprié pour ce faire. Des idées?
- La base de données que vous utilisez?
- Je suis à l'aide de SQLCe (compact edition) 4.0 intégré avec entity framework.
- Donc, vous n'avez qu'une seule option ici - déplacer les calculs à côté client SQL CE 4 EF fournisseur ne peut pas se traduire en requêtes SQL
Vous devez vous connecter pour publier un commentaire.
Une optimisation de votre code est à utiliser
AsEnumerable()
après laWhere
méthode. Si non, chaque entité est retourné à partir de stockage, et l'ensemble du tableau est examinée à l'aide de LINQ to Objects. Avec cette simple modification de votre code, vous laissez la clause where exécuter sur sql et de récupérer moins de dossiers de stockage. La règle générale est de placer toutes les clauses de requête qui sont mis en œuvre par le fournisseur LINQ premier..AsEnumerable()
, comme vous l'avez fait dans l'exemple en utilisantWhere(...)
. Sinon, les choses pourraient devenir incroyablement lent, parce que vous faites cela en mémoire plutôt que dans la base de données.EF ne peut pas convertir
String.Format
en SQL, mais elle gère concaténations de chaîne sans problème. UtilisationSqlFunctions.StringConvert
au lieu deString.Format
pour convertir nombre en une chaîne de caractères sur le côté serveur:Il génère quelque chose comme
Mise à JOUR: vous êtes Donc à l'aide de EF fournisseur qui ne prend pas en charge la conversion (SQL CE fournisseur ne peut pas ne peut pas traduire cette requête en SQL), vous avez une seule option à gauche - déplacer les calculs à côté client, comme vous avez déjà fait.
AsEnumerable()
)Select(w => new { w.Name, w.Id }).AsEnumerable().Select(x => new { Alias = x.Name + x.Id, x.Name })