Używam T4 do generowania repozytoriów dla LINQ do jednostek Entities.Jak sprawdzić obecność OrderBy w drzewie wyrażenia ObjectQuery <T>
Repozytorium zawiera (między innymi) metodę listy odpowiednią do stronicowania. Dokumentacja dla Supported and Unsupported Methods nie wspomina o tym, ale nie można "zadzwonić" pod numer Skip
po nieuporządkowanym IQueryable
. Podniesie następujący wyjątek:
System.NotSupportedException: metoda „skip” jest obsługiwana tylko dla posortowane wejścia w LINQ podmiotom. Metoda „OrderBy” musi zostać wywołana przed metoda „Pomiń” ..
Rozwiązałem go, pozwalając na zdefiniowanie domyślnego sortowania poprzez częściowe metody. Ale mam problem ze sprawdzeniem, czy drzewo wyrażeń rzeczywiście zawiera OrderBy
.
mam zmniejszona problem jako mniej kodu, jak to możliwe:
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery);
public IQueryable<Category> List(int startIndex, int count)
{
IQueryable<Category> query = List();
ProvideDefaultSorting(ref query);
if (!IsSorted(query))
{
query = query.OrderBy(c => c.CategoryID);
}
return query.Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression, int startIndex, int count)
{
return List(sortExpression).Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression)
{
return AddSortingToTheExpressionTree(List(), sortExpression);
}
public IQueryable<Category> List()
{
NorthwindEntities ent = new NorthwindEntities();
return ent.Categories;
}
private Boolean IsSorted(IQueryable<Category> query)
{
return query is IOrderedQueryable<Category>;
}
}
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery)
{
currentQuery = currentQuery.Where(c => c.CategoryName.Contains(" ")); // no sorting..
}
}
To nie jest moja prawdziwa realizacja!
Ale moje pytanie pytanie jest, jak mogę wdrożyć metodę IsSorted
? Problem polega na tym, że zapytania LINQ do encji są zawsze typu ObjectQuery
, który implementuje IOrderedQueryable
.
Jak zatem upewnić się, że w drzewie wyrażeń jest dostępna metoda OrderBy
? Czy jest jedyną opcją parsowania drzewa?
Aktualizacja
Dodałem dwa inne przeciążeń, by wyjaśnić, że nie chodzi o to, jak dodać obsługę sortowania do repozytorium, ale jak sprawdzić, czy częściowa metoda ProvideDefaultSorting
rzeczywiście dodał OrderBy
do drzewa wyrażenie .
Problem polega na tym, że pierwsza klasa cząstkowa jest generowana przez szablon, a implementacja drugiej części klasy częściowej jest dokonywana przez członka zespołu w innym czasie. Można to porównać ze sposobem, w jaki struktura .NET Entity Framework generuje EntityContext, umożliwiając punkty rozszerzeń innym programistom. Dlatego chcę, aby była solidna i nie uległa awarii, gdy ProvideDefaultSorting
nie została poprawnie zaimplementowana.
Może więc chodzi o coś więcej, jak mogę potwierdzić, że ProvideDefaultSorting
rzeczywiście dodał sortowanie do drzewa wyrażeń.
Aktualizacja 2
Nowe pytanie odpowiedział i zaakceptowane, myślę, że powinienem zmienić tytuł dopasować pytanie bardziej. Czy powinienem zostawić obecny tytuł, ponieważ doprowadzi to ludzi z tym samym problemem do tego rozwiązania?
Powinieneś zobaczyć tę odpowiedź http://stackoverflow.com/questions/36923850/how-to-know-if-orderby-was-applied-to-query – yosbel