Znalazłem przykład w VS2008 Przykłady dla dynamicznego LINQ, który pozwala na użycie łańcucha podobnego do sql (np. OrderBy("Name, Age DESC"))
Do zamawiania. Niestety, dołączona metoda działa tylko na IQueryable<T>
. Czy jest jakiś sposób na włączenie tej funkcjonalności IEnumerable<T>
?
c#
linq
linq-to-objects
John Sheehan
źródło
źródło
Odpowiedzi:
Właśnie natknąłem się na tego staruszka ...
Aby to zrobić bez dynamicznej biblioteki LINQ, wystarczy kod jak poniżej. Dotyczy to najczęstszych scenariuszy, w tym właściwości zagnieżdżonych.
Aby to działało,
IEnumerable<T>
możesz dodać kilka metod otoki, które przechodząAsQueryable
- ale poniższy kod jest podstawowąExpression
logiką.Edycja: staje się bardziej zabawna, jeśli chcesz to mieszać
dynamic
- chociaż uwagadynamic
dotyczy tylko LINQ-do-Obiektów (drzewa wyrażeń dla ORM itp. Nie mogą tak naprawdę reprezentowaćdynamic
zapytań -MemberExpression
nie obsługuje tego). Ale oto sposób na zrobienie tego za pomocą LINQ-to-Objects. Zauważ, że wybórHashtable
wynika z korzystnej semantyki blokowania:źródło
IQueryable<T>
, więc jeśli masz coś takiegoList<T>
(co jestIEnumerable<T>
), możesz potrzebować użyćAsQueryable()
- na przykładvar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
Zbyt łatwe bez komplikacji:
using System.Linq.Dynamic;
u góry.vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
źródło
System.Linq.Dynamic
?Znalazłem odpowiedź Mogę użyć
.AsQueryable<>()
metody rozszerzenia do przekonwertowania mojej listy na IQueryable, a następnie uruchomić przeciwko niej dynamiczną kolejność.źródło
Natknąłem się na to pytanie.
Korzystając z implementacji MarcOr ApplyOrder z góry, spoliczniłem metodę Extension, która obsługuje ciągi podobne do SQL, takie jak:
Szczegóły można znaleźć tutaj: http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
źródło
Wydaje mi się, że warto użyć refleksji, aby uzyskać dowolną właściwość, na której chcesz sortować:
Zauważ, że użycie odbicia jest znacznie wolniejsze niż bezpośredni dostęp do właściwości, więc należałoby zbadać wydajność.
źródło
Opierając się na tym, co powiedzieli inni. Odkryłem, że następujące działa całkiem dobrze.
źródło
Natknąłem się na to pytanie, szukając wielokrotnych klauzul porządkowych Linq i być może tego szukał autor
Oto jak to zrobić:
źródło
Próbowałem to zrobić, ale miałem problemy z rozwiązaniem Kjetil Watnedal, ponieważ nie używam wbudowanej składni linq - wolę składnię w stylu metody. Moim specyficznym problemem była próba dynamicznego sortowania przy użyciu niestandardowego
IComparer
.Moje rozwiązanie skończyło się tak:
Biorąc pod uwagę zapytanie IQueryable:
I biorąc pod uwagę argument pola sortowania w czasie wykonywania:
Dynamiczny OrderBy wygląda tak:
I to przy użyciu małej metody pomocniczej o nazwie GetReflectedPropertyValue ():
I ostatnia rzecz - wspomniałem, że chcę
OrderBy
użyć niestandardowegoIComparer
- ponieważ chciałem dokonać naturalnego sortowania .Aby to zrobić, po prostu zmieniam na
OrderBy
:Zobacz ten post dla kodu dla
NaturalSortComparer()
.źródło
Użyj dynamicznego
linq
poprostu dodaj
using System.Linq.Dynamic;
I użyj go w ten sposób, aby uporządkować wszystkie kolumny:
źródło
Możesz to dodać:
Ta
GetPropertyValue
funkcja pochodzi z odpowiedzi Kjetila WatnedalaProblemem byłoby dlaczego? Każdy tego rodzaju generowałby wyjątki w czasie wykonywania, a nie kompilował (jak odpowiedź D2VIANT).
Jeśli masz do czynienia z Linq do Sql, a kolejność jest drzewem wyrażeń, to i tak zostanie przekonwertowane na SQL.
źródło
OrderBy
nie utrzymuj poprzedniego zamówienia !!Oto coś, co uznałem za interesujące. Jeśli źródłem jest DataTable, możesz użyć sortowania dynamicznego bez użycia Dynamic Linq
odniesienie: http://msdn.microsoft.com/en-us/library/bb669083.aspx (Korzystanie z DataSetExtensions)
Oto jeszcze jeden sposób, aby to zrobić, przekształcając go w DataView:
źródło
Dzięki Maarten ( zapytanie kolekcji przy użyciu obiektu PropertyInfo w LINQ ) otrzymałem to rozwiązanie:
W moim przypadku pracowałem nad „ColumnHeaderMouseClick” (WindowsForm), więc właśnie znalazłem konkretną kolumnę wciśniętą i odpowiadającą jej właściwość PropertyInfo:
LUB
(pamiętaj, aby Nazwy kolumn pasowały do właściwości obiektu)
Twoje zdrowie
źródło
Po wielu poszukiwaniach zadziałało to dla mnie:
źródło
Możesz przekonwertować IEnumerable na IQueryable.
źródło
Alternatywne rozwiązanie wykorzystuje następującą klasę / interfejs. Nie jest tak naprawdę dynamiczny, ale działa.
źródło
Ta odpowiedź jest odpowiedzią na komentarze, które potrzebują przykładu rozwiązania dostarczonego przez @John Sheehan - Runscope
w DAL (warstwa dostępu do danych),
Wersja IEnumerable:
Wersja IQueryable
Teraz możesz używać wersji IQueryable do wiązania, na przykład GridView w Asp.net i korzystać z sortowania (nie można sortować przy użyciu wersji IEnumerable)
Użyłem Dappera jako ORM i zbudowałem wersję IQueryable i tak łatwo posortowałem w GridView w asp.net.
źródło
Najpierw zainstaluj narzędzia dynamiczne -> Menedżer pakietów NuGet -> Konsola menedżera pakietów
Dodaj przestrzeń nazw
using System.Linq.Dynamic;
Teraz możesz użyć
OrderBy("Name, Age DESC")
źródło
Możesz użyć tego:
źródło
Konwertuj listę na IEnumerable lub Iquerable, dodaj używając System.LINQ.Dynamic przestrzeni nazw, a następnie możesz wspomnieć nazwy właściwości w łańcuchu oddzielonym przecinkami do metody OrderBy, która domyślnie pochodzi z System.LINQ.Dynamic.
źródło
źródło