Podczas próby wykonania zapytania linq pojawia się następujący błąd:
LINQ to Entities nie rozpoznaje metody `` Boolean IsCharityMatching (System.String, System.String) '' i tej metody nie można przetłumaczyć na wyrażenie magazynu.
Przeczytałem wiele poprzednich pytań, w których ludzie dostają ten sam błąd i jeśli dobrze to rozumiem, to dlatego, że LINQ to Entities wymaga, aby całe wyrażenie zapytania linq zostało przetłumaczone na zapytanie serwera, a zatem nie można wywołać metody zewnętrznej w tym. Nie byłem w stanie przekształcić mojego scenariusza w coś, co jeszcze działa, a mój mózg zaczyna się topić, więc miałem nadzieję, że ktoś wskaże mi właściwy kierunek. Używamy Entity Framework i wzorca specyfikacji (i jestem nowy w obu).
Oto kod, który używa specyfikacji:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);
charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();
Oto wyrażenie linq:
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
return p => p.IsCharityMatching(this.charityName, this.charityReference);
}
Oto metoda IsCharityMatching:
public bool IsCharityMatching(string name, string referenceNumber)
{
bool exists = true;
if (!String.IsNullOrEmpty(name))
{
if (!this.registeredName.ToLower().Contains(name.ToLower()) &&
!this.alias.ToLower().Contains(name.ToLower()) &&
!this.charityId.ToLower().Contains(name.ToLower()))
{
exists = false;
}
}
if (!String.IsNullOrEmpty(referenceNumber))
{
if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower()))
{
exists = false;
}
}
return exists;
}
Daj mi znać, jeśli potrzebujesz więcej informacji.
Wielkie dzięki,
Annelie
Find()
kiedy używasz wIsSatisfied()
środku.Odpowiedzi:
Jak się zorientowałeś, Entity Framework nie może w rzeczywistości uruchomić kodu C # jako części zapytania. Musi być w stanie przekonwertować zapytanie na rzeczywistą instrukcję SQL. Aby to zadziałało, będziesz musiał zmienić strukturę wyrażenia zapytania na wyrażenie, które może obsługiwać Entity Framework.
źródło
Expression<Func<T,type>>
Bardzo fajnym podejściem do tego jest zwrócenie skonstruowanego .context.Where(IsSatisfied())
Mam ten sam błąd w tym kodzie:
to był dokładnie błąd:
Rozwiązałem w ten sposób:
Dodałem .ToList () przed moją tabelą, co oddziela kod Entity i linq i pozwala uniknąć tłumaczenia mojego następnego wyrażenia linq
UWAGA: to rozwiązanie nie jest optymalne, ponieważ unikaj filtrowania jednostek i po prostu ładuje całą tabelę do pamięci
źródło
Jeśli ktoś szuka odpowiedzi VB.Net (tak jak ja początkowo), oto ona:
źródło
Miałem podobny problem do twojego, a ta dokumentacja LINQ pomogła mi znaleźć odpowiednie funkcje ciągów do obejścia ograniczeń.
źródło