web-dev-qa-db-fra.com

Entity Framework - Impossible de convertir l'expression lambda en type 'chaîne' car ce n'est pas un type délégué

J'utilise Entity Framework dans mon code basé sur C #. Je me heurte à une étrangeté inattendue et cherche des suggestions.

Cas 1, 2, 3, 4 ... Projets:
RivWorks.dll
RivWorks.Service.dll
RivWorks.Alpha.dll 

Échantillons (tous ces travaux):
RivWorks.Alpha.dll:

public static bool EndNegotitation(long ProductID)
{
    var product = (from a in _dbFeed.AutoWithImage 
                   where a.AutoID == ProductID select a).FirstOrDefault();
...
}

RivWorks.Service.dll

public static RivWorks.Model.NegotiationAutos.AutoWithImage 
    GetProductById(long productId)
{
    var myProduct = from a in _dbFeed.AutoWithImage 
                    where a.AutoID == productId select a;

    return myProduct.FirstOrDefault();
}
public static List<RivWorks.Model.NegotiationAutos.AutoWithImage> 
    GetProductByCompany(Guid companyId)
{
    var myProduct = from a in _dbFeed.AutoWithImage 
                    where a.CompanyID == companyId select a;

    return myProduct.ToList();
}

etc

Cas "bizarre":
RivWorks.Web.Service.dll (projet WCF)
Contient les mêmes références que les autres projets.

public NegotiateSetup GetSetup(string method, string jsonInput)
{
    ...
    long.TryParse(ProductID, out result);
    var product = (from a in _dbFeed.AutoWithImage 
                   where a.AutoID == result select a).FirstOrDefault();
    ...
}

Je reçois cette erreur de compilation (le mot "où" est mis en évidence dans mon éditeur):
Impossible de convertir l'expression lambda en type 'chaîne' car ce n'est pas un type de délégué

Des idées ce qui causerait ceci?

70
Keith Barrows

Pour ceux intéressés par le résultat:
Il me manquait une simple instruction Using en tête de mon code.

using System.Linq;

Cela a réglé le problème.

110
Keith Barrows

Dans mon cas il manquait 

using System.Data.Entity;

92
Miguel Galante
using System.Linq;
using System.Data.Entity;
9
Dorathoto

Je me débattais avec cela dans un modèle de grille Telerik dans une vue rasoir pendant environ une heure. Dans mon cas, ceci:

columns.Bound(x => x.ID).Template(@<text><a href="@(Model.AppUrl + AdditionalFeeTypes/Details/" + item.ID)">@item.ID</a></text>);

était censé être ceci:

columns.Bound(x => x.Id).Template(@<text><a href="@(Model.AppUrl + AdditionalFeeTypes/Details/" + item.Id)">@item.Id</a></text>);

L'affaire sur "Id" était fausse! J'espère que ça aidera quelqu'un. Vous pourriez recevoir cette erreur simplement parce que vous avez mis une propriété inexistante!

7
Chris

Dans mon cas, j'ai eu le

Using System.Linq;

mais il me manquait le && après un élément de clause where.

Mauvais code:

item.Group.ID == grp.ID
p.Product_Status_Flag == 1 &&
item.Valid

Code correct (sans erreur):

item.Group.ID == grp.ID && // <- This was missing and I didn't see it right away.
p.Product_Status_Flag == 1 &&
item.Valid

J'espère que cela sauve du temps à quelqu'un.

7
jhamm

Je suis tombé sur ceci et ai trouvé une solution différente. J'utilisais var query = context.Contacts.Where(c => c.FullNameReverse == "TingTong"); et j'obtenais l'erreur mentionnée. L'erreur était que j'utilisais la méthode FullNameReverse() en tant que propriété FullNameReverse. Manqué le ()!!!

2
FastDev

j'ai eu le même problème avec MVC 3 rasoir peut-être que quelqu'un a la même chose, donc je veux montrer comment le réparer dans mon stuation

List<Taksit> lst = db.Taksit.Where(y => y.OgrenciId.Equals(Convert.ToInt32( list[0].Id))).ToList();

j'ai essayé d'utiliser contient mais par conséquent OgrenciId est int i obtenir l'erreur mentionnée ici, donc en utilisant égal, le problème est résolu

1
mathel

Le fil est un peu vieux, mais je viens juste de le rencontrer, et rien sur le net n'était la solution. Un site a mentionné ce qui a conduit à la réponse, à savoir un problème de type de données, mais malheureusement, je ne le retrouve pas encore. Je publie ici ma solution. Peut-être qu'un chercheur futur en tirera profit.

Original: IQueryable test = from r dans Records où r.Record_ID == 100, sélectionnez r;

où Records est un IQueryable résultant d’une expression LINQ antérieure.

Le correctif consiste à convertir les enregistrements: (IQueryable <record>) dans l’expression. Après l'avoir trouvé, c'est parfaitement logique. Les enregistrements ne sont pas saisis, donc le LINQ n'a aucune idée si r.Record_ID est valide. La confusion est le message d'erreur, qui apparaît partout sur le net dans des dizaines d'endroits, dans presque tous les cas, la solution étant l'une des deux clauses using manquantes. Le ou les deux que j'ai trouvés n'étaient pas un problème d'utilisation, ils ne se sont pas donné la peine de poster ce qui a été corrigé.

J'espère que cela t'aides...

1
Ragnorok

Mon problème concernait le format:

.Columns(columns => {
    columns.Bound(p => p.Id).Filterable(false);
    columns.Bound(p => p.Name).Width(250);
    ...

Chaque personne qui avait cette erreur sur elle.

Il s’agissait d’un projet utilisant MVC et j’ai constaté que mon problème était d’avoir "public static int" ou "public static string" sur ces variables (Id, Nom, etc.) dans mon modèle. Quand j'ai supprimé "statique" sur toutes mes variables de modèle, je n'ai plus l'erreur. Ca me rendait fou pendant environ une journée ...

0
vapcguy

J'ai eu un problème similaire mais avec Rx et dans mon cas, en ajoutant 

using System;

aidé. FWIW

Mess avec ces méthodes d'extension manquant est parfois trop ennuyeux.

0
Valentin Kuzub

J'ai eu ce problème dans une version légèrement différente.
Si vous appelez une méthode (statique) depuis l’intérieur de votre lambda, vérifiez son type de retour. Si le type de retour doit être un IEnumerable (ce qui est souvent le cas lorsque vous utilisez lambdas) mais que vous renvoyez un objet, vous avez évidemment un problème.

0
Andi Truman

J'avais un problème similaire à la liaison des colonnes à une grille Telerik MVC .J'ai eu une propriété Id sur ma classe ViewModel. (Inspiré par la réponse de Chris ci-dessus) Je l'ai renommé XxxId et le problème a disparu. Il me semble rappeler quelque chose à propos de MVC faisant quelque chose de spécial pour les propriétés Id.

0
Craig Fisher

Dans mon cas, j'ai eu cette erreur en essayant d'utiliser Include dans clientContext.Load dans une application SharePoint 2014.

J'avais inclus la bibliothèque client Sharepoint comme ceci:

using SP = Microsoft.SharePoint.Client;

Pour résoudre ce problème, je l’ai aussi ajouté sans le namespace:

using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;
0
Demelziraptor

Essayez juste En utilisant System.Linq; Je pense que cela vous aidera à résoudre ces problèmes.

0
Jinto John