J'obtiens cette exception:
Le membre de type spécifié «Payé» n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge.
public ActionResult Index()
{
var debts = storeDB.Orders
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
return View(debts);
}
Ma classe de modèle
public partial class Order
{
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return Payments.Sum(p => p.Amount);
}
}
Paiements est une table associée contenant le montant du champ, la requête fonctionne si je supprime la clause Where affichant des informations correctes sur les paiements, un indice quel est le problème avec le code?
Résolu comme la réponse suggérée avec:
public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
Réponses:
L'entité tente de convertir votre propriété payante en SQL et ne peut pas, car elle ne fait pas partie du schéma de table.
Ce que vous pouvez faire est de laisser Entity interroger la table sans filtre payant, puis de filtrer les non payants.
Cela signifierait bien sûr que vous rapportiez toutes les données au serveur Web et que vous filtriez les données sur celui-ci. Si vous souhaitez filtrer sur le serveur de base de données, vous pouvez créer une colonne calculée sur la table ou utiliser une procédure stockée.
la source
Juste eu à résoudre un problème similaire. Les solutions ci-dessus nécessitent un traitement en mémoire, ce qui est une mauvaise pratique (chargement différé).
Ma solution était d'écrire un helper qui retournait un prédicat:
Vous pouvez réécrire votre instruction linq comme suit:
Ceci est pratique lorsque vous souhaitez réutiliser la logique de calcul (DRY). L'inconvénient est que la logique n'est pas dans votre modèle de domaine.
la source
Expression<Func<xx,yy>>
. Je l'ai déjà compris avant, mais cela semble évident maintenant.Ce problème peut également provenir d'une
[NotMapped]
propriété qui porte le même nom dans votre modèle de base de données et votre modèle de vue.AutoMapper essaie de le sélectionner dans la base de données pendant une projection; et la propriété NotMapped n'existe évidemment pas dans la base de données.
La solution consiste à
Ignore
utiliser la propriété dans la configuration de l'AutoMapper lors du mappage du modèle de base de données au modèle de vue.[NotMapped]
propriété avec un nomFoo
dans votre modèle de base de données.Foo
,, dans votre modèle de vue..ForMember(a => a.Foo, b => b.Ignore());
la source
Désormais, cette conversion se produit uniquement pour les membres d'entités, les initialiseurs et les propriétés de navigation d'entité. Donc, pour obtenir une fonction ou une comparaison de propriétés, nous devons d'abord les convertir en liste en mémoire, puis appliquer une fonction pour récupérer les données.
Donc dans la totalité,
la source
L'autre raison probable est que vous utilisez
IEnumerable
pour votre propriété au lieu deICollection
Donc au lieu de:
Faites ceci:
Et vous êtes dory hunky ... chose stupide à perdre 2 heures de plus.
la source
Cette situation peut également se produire si vous utilisez des types EntityFramework non pris en charge , tels que unsigned int.
C'était mon cas d'une telle erreur.
Consultez plus d'informations sur les types pris en charge: https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx
Il existe une solution de contournement pour de telles situations, expliquées par GFoley83: Comment utiliser des types int / long non signés avec Entity Framework?
la source
J'ai rencontré ce problème car j'avais une variable membre avec uniquement une
get
without set
propriétécela signifie son
auto calculated
et ennot stored
tant que colonne dansthe table
donc c'est
not exist
dans letable schema
la source
votre edmx et votre modèle de contexte ont des propriétés différentes qui sont nouvellement ajoutées dans db.
Mettez à jour votre EDMX, actualisez-le correctement. Bulidez votre projet et relancez-le.
Cela résoudra votre problème.
Cordialement, Ganesh Nikam
la source