Otrzymuję ten wyjątek:
Podany typ członkowski „Płatny” nie jest obsługiwany w LINQ to Entities. Obsługiwane są tylko inicjatory, elementy członkowskie jednostek i właściwości nawigacji jednostek.
public ActionResult Index()
{
var debts = storeDB.Orders
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
return View(debts);
}
Klasa My Model
public partial class Order
{
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return Payments.Sum(p => p.Amount);
}
}
Płatności to Powiązana tabela zawierająca kwotę pola. Zapytanie działa, jeśli usunę klauzulę Where, pokazującą prawidłowe informacje o płatnościach, jakąkolwiek wskazówkę, co jest nie tak z kodem?
Rozwiązany jak sugerowana odpowiedź:
public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
linq
entity-framework
Marc
źródło
źródło
Odpowiedzi:
Jednostka próbuje przekonwertować Twoją płatną właściwość na SQL i nie może, ponieważ nie jest ona częścią schematu tabeli.
Co możesz zrobić, to pozwolić Entity odpytać tabelę bez filtru Płatne, a następnie odfiltrować te, które nie zostały opłacone.
To oczywiście oznaczałoby, że przenosisz wszystkie dane z powrotem na serwer sieciowy i filtrujesz je. Jeśli chcesz filtrować na serwerze bazy danych, możesz utworzyć kolumnę obliczeniową w tabeli lub użyć procedury składowanej.
źródło
Musiałem tylko rozwiązać podobny problem. Powyższe rozwiązania wymagają przetwarzania w pamięci, co jest złą praktyką (leniwe ładowanie).
Moim rozwiązaniem było napisanie helpera zwracającego predykat:
Możesz przepisać swoją instrukcję linq jako:
Jest to przydatne, gdy chcesz ponownie użyć logiki obliczeniowej (DRY). Wadą jest to, że logika nie znajduje się w modelu domeny.
źródło
Expression<Func<xx,yy>>
. Wcześniej to rozumiałem, ale teraz wygląda to na oczywiste.Ten problem może również pochodzić z
[NotMapped]
właściwości, która ma taką samą nazwę w modelu bazy danych i modelu widoku.AutoMapper próbuje wybrać go z bazy danych podczas projekcji; a właściwość NotMapped oczywiście nie istnieje w bazie danych.
Rozwiązaniem jest
Ignore
właściwość w konfiguracji AutoMapper podczas mapowania z modelu bazy danych do modelu widoku.[NotMapped]
właściwości o nazwieFoo
w swoim modelu bazy danych.Foo
w swoim modelu widoku..ForMember(a => a.Foo, b => b.Ignore());
źródło
Teraz ta konwersja występuje tylko dla elementów członkowskich jednostek, inicjatorów i właściwości nawigacji jednostek. Aby uzyskać porównanie funkcji lub właściwości, musimy najpierw przekonwertować je na listę w pamięci, a następnie zastosować funkcję w celu pobrania danych.
Dlatego w całości
źródło
Innym prawdopodobnym powodem jest to
IEnumerable
, że zamiast tego używasz dla swojej nieruchomościICollection
Więc zamiast:
Zrób to:
A ty jesteś hunky dory ... głupio tracić 2 godziny.
źródło
Ta sytuacja może się również zdarzyć, jeśli używasz nieobsługiwanych przez typy EntityFramework , takie jak unsigned int.
To był mój przypadek takiego błędu.
Sprawdź dalsze informacje na temat obsługiwanych typów: https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx
Istnieje pewne obejście takich sytuacji, wyjaśnione przez GFoley83: Jak używać typów int / long bez znaku w Entity Framework?
źródło
Napotkałem ten problem, ponieważ miałem zmienną składową z tylko
get
without set
właściwościąto znaczy jego
auto calculated
inot stored
jako kolumna wthe table
dlatego jest
not exist
wtable schema
źródło
Twój edmx i model kontekstu mają pewną inną właściwość, która jest nowo dodana do bazy danych.
Zaktualizuj EDMX, odśwież go poprawnie Utwórz projekt i uruchom ponownie.
To rozwiąże Twój problem.
Pozdrawiam, Ganesh Nikam
źródło