Przekazywanie części wyrażenia LINQ przez argument metody

Przekazywanie części wyrażenia LINQ przez argument metody
TK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 342
0

Mam kolekcje MongoDB o nazwie File, ktore zawiera atrybut UploadedAt. Chcę wyciągnąć z tej kolekcji dane z pewnego przedziału czasowego. Robię to tak mniej więcej tak:

Kopiuj
files
    .Find(f => f.UploadedAt > DateTime.Now.AddDays(-1) && f.UploadedAt <= DateTime.Now)
    .ToList();

Teraz chciałbym mieć możliwość napisania metody użytkowej, która pozwoli mi na pobranie danych według kryteriów opartych o dowolne atrybut (a nie tylko o UploadedAt). Próbowałem tak:

Kopiuj
public List<Domain.File.File> SomeMethod(
            IMongoCollection<Domain.File.File> collection, 
            Func<Domain.File.File, DateTime> field)
{
    return collection
        .Find(f => field(f) > DateTime.Now.AddDays(-1) && f.UploadedAt <= DateTime.Now)
        .ToList();
}

Kompiluje się, ale podczas wywołania metody w następujący sposób:

Kopiuj
SomeMethod(_collections.Files, f => f.UploadedAt);

Dostaję wyjątek:

Kopiuj
MongoDB.Driver.Linq.ExpressionNotSupportedException: Expression not supported

Czy istnieje jakiś sposób na to żeby osiągnąć zamierzony cel?

SZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1596
2

EE to musisz Expression budować dynamicznie. Czyli coś co zwraca expression ma zwrócić: Expression<Func<File,bool>>. Czyli twoje expression factory dostaje dane, nazwe pola i buduje dynamicznie całość

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.