Sono supportati solo gli inizializzatori, i membri dell’entity framework e le proprietà di navigazione delle quadro

Sto ricevendo questa eccezione:

Il membro del tipo specificato “Pagato” non è supportato in LINQ alle entity framework. Sono supportati solo gli inizializzatori, i membri dell’entity framework e le proprietà di navigazione delle quadro.

public ActionResult Index() { var debts = storeDB.Orders .Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated); return View(debts); } 

La mia class di modello

 public partial class Order { public bool Paid { get { return TotalPaid >= Total; } } public decimal TotalPaid { get { return Payments.Sum(p => p.Amount); } } 

I pagamenti sono una tabella correlata contenente l’importo del campo, La query funziona se rimuovo la clausola Where che mostra le informazioni corrette sui pagamenti, qualsiasi indizio che cosa c’è di sbagliato nel codice?

Risolto come la risposta suggerita con:

  public ActionResult Index() { var debts = storeDB.Orders .OrderByDescending(o => o.DateCreated) .ToList() .Where(o => o.Paid == false); return View(debts); } 

Entity sta provando a convertire la proprietà Paid in SQL e non può perché non fa parte dello schema della tabella.

Quello che puoi fare è permettere a Entity di interrogare la tabella senza filtro Paid e quindi filtrare quelli non a pagamento.

 public ActionResult Index() { var debts = storeDB.Orders //.Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated); debts = debts.Where(o => o.Paid == false); return View(debts); } 

Ciò, ovviamente, significherebbe che si riportano tutti i dati sul server Web e si filtrano i dati su di esso. Se si desidera filtrare sul server DB, è ansible creare una colonna calcasting sulla tabella o utilizzare una stored procedure.

Dovevo solo risolvere un problema simile. Le soluzioni sopra richiedono l’elaborazione in memoria, che è una ctriggers pratica (caricamento lento).

La mia soluzione era scrivere un helper che restituisse un predicato:

 public static class Extensions { public static Expression> IsPaid() { return order => order.Payments.Sum(p => p.Amount) >= order.Total; } } 

È ansible riscrivere l’istruzione linq come:

 var debts = storeDB.Orders .Where(Extensions.IsPaid()) .OrderByDescending(o => o.DateCreated); 

Questo è utile quando si desidera riutilizzare la logica di calcolo (DRY). Il rovescio della medaglia è che la logica non è nel tuo modello di dominio.

Linq converte le istruzioni in istruzioni SQL e le esegue nel database.

Ora, questa conversione si verifica solo per quadro membri, inizializzatori e proprietà di navigazione delle entity framework. Quindi, per ottenere la funzione o ottenere il confronto delle proprietà, è necessario prima convertirle in un elenco in memoria e quindi applicare la funzione per recuperare i dati.

Quindi, in totale,

 var debts = storeDB.Orders.toList() .Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated); 

Questo problema può anche derivare da una proprietà [NotMapped] che ha lo stesso nome nel modello DB e nel modello di vista.

AutoMapper tenta di selezionarlo dal DB durante una proiezione; e la proprietà NotMapped ovviamente non esiste nel DB.

La soluzione è Ignore la proprietà nella configurazione di AutoMapper durante l’associazione dal modello DB al modello di vista.

  1. Cerca una proprietà [NotMapped] con nome Foo nel tuo modello DB.
  2. Cerca una proprietà con lo stesso nome, Foo , nel tuo Modello di vista.
  3. In questo caso, modifica la configurazione di AutoMapper. Aggiungi .ForMember(a => a.Foo, b => b.Ignore());

L’altra probabile ragione è perché stai usando IEnumerable per la tua proprietà, invece di ICollection

Quindi, invece di:

 public class This { public long Id { get; set; } //... public virtual IEnumerable Thats { get; set; } } 

Fai questo:

 public class This { public long Id { get; set; } //... public virtual ICollection Thats { get; set; } } 

E tu sei hunky dory … cosa stupida da perdere 2 ore oltre …

Questa situazione può verificarsi anche se si utilizza un tipo non supportato da EntityFramework , come int unsigned.

Questo è stato il mio caso di un simile errore.

Leggi ulteriori informazioni sui tipi supportati: https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx

C’è qualche soluzione alternativa per queste situazioni, spiegata da GFoley83: Come utilizzare i tipi unsigned int / long con Entity Framework?

Ho affrontato questo problema perché stava avendo una variabile membro con solo without set proprietà without set

questo significa che la sua auto calculated e not stored come una colonna nella the table

quindi not exist nello table schema della table schema

quindi make sure che qualsiasi variabile membro not auto calculated per have proprietà getter e setter