muszę filtrować listę dokumentów, przekazując je do filtru niestandardowego, że jestem stara się zbudować dynamicznieużywając foreach
pętlę:Budowanie niestandardowego orzecznik działać jako filtr przy użyciu foreach pętli
var mainPredicate = PredicateBuilder.True<Document>();
// mainPredicate is combined to other filters successfully here ...
var innerPredicate = PredicateBuilder.False<Document>();
foreach (var period in periods)
{
var p = period;
Expression<Func<Document, bool>> inPeriod =
d => d.Date >= p.DateFrom && d.Date <= p.DateTo;
innerPredicate = innerPredicate.Or(d => inPeriod.Invoke(d));
}
mainPredicate = mainPredicate.And(innerPredicate);
Ta ostatnia linia:
documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();
generuje ten wyjątek:
Parametr "d" nie był powiązany w określonym wyrażeniu zapytania LINQ to Entity .
Ktoś wie, dlaczego otrzymuję ten wyjątek? Nie rozumiem, gdzie tracę parametr "d", który przekazuję do metody InPeriod. Nie wiem, czego brakuje, aby to zadziałało. Mój kod jest taki sam jak wiele innych przykładów, które działają idealnie. Wszelkie mile widziane teoretyczne informacje na temat powoływania się na wyrażenia i tego, jak działa za kulisami, są mile widziane.
Co się stanie, jeśli wykonasz 'mainPredicate.Expand() .Kompiluj(). Invoke (someDocument)'? Jesteś pewien, że problem nie leży gdzieś indziej (Twój kod wygląda dla mnie dobrze)? – svick
Biorąc pod uwagę Twoją sugestię, zmodyfikowałem ostatnią linię tak, aby wyglądała następująco: 'documentEntries = this.ObjectSet.AsExpandable(). Gdzie (de => mainPredicate.Expand() .Kompiluj(). Invoke (de)). ToList (); 'ale rzuca: LINQ to Entities nie rozpoznaje metody 'Boolean Invoke (Remabec.PM.Tarification.DocumentEntry)' metoda, a tej metody nie można przetłumaczyć na wyrażenie store. –
Tak, to nie zadziała i nie o to mi chodziło. Czy mógłbyś spróbować wykonać mój kod sam? – svick