2011-12-13 13 views
5

Starałem się, aby to działało. Chciałbym, aby oświadczenie EF przyjęło kolumnę na zamówienie. Moja wypowiedź była to oryginalna:Entity Framework i dynamiczne zamówienie według instrukcji

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby P.LastName 
        select P; 

A ja zmieniłem to na następujące kwestie:

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby sortField 
        select P; 

Gdzie sortField jest kolumna chcemy posortować, a jest ciągiem tj LastName. Jednak wydaje się, że nie działa, nie sortuje, a wyjściowy ciąg SQL jest całkowicie błędny. Czy ktoś już to pracował?

Odpowiedz

11

można spróbować przechodzącą w wyrażeniu do metody z następujących typów:

Expression<Func<Person, object>> expr = p => p.LastName; 

a następnie przy użyciu rozszerzeń LINQ zamiast wyrażeń LINQ ...

var Query = 
DbContext.People 
.Where(P => P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId)) 
.OrderBy(expr) 
.ToList(); 
+0

Doskonała odpowiedź, w tym konkretnym przypadku, to wydaje się lepsze rozwiązanie więc użyję tego, dzięki. – eyeballpaul

+0

Czy istnieje sposób dodania tutaj klauzuli "asc" i "desc"? – eyeballpaul

+0

Ponadto, dlaczego miałoby to działać z właściwościami łańcuchowymi, a nie liczbami całkowitymi? Jedną z właściwości jest Int32, a kiedy próbuję sortować w tej kolejności, pojawia się błąd: "{" Nie można rzutować typu "System.Int32", aby wpisać "System.Object". LINQ to Entities obsługuje tylko podstawowe typy rzutowania Entity Data Model. "}" – eyeballpaul

3

Twój sortowania nie działa ponieważ sortujesz literał łańcuchowy. Nie jest to nielegalne, ale nie jest szczególnie użyteczne. Trzeba zapewnić pole sortowania przez API IQueryable<T>, na przykład tak:

var q = from P in DbContext.People 
    where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
    orderby P.LastName 
    select P; 
if ("sortField".Equals("FirstName")) 
    q = q.OrderBy(p => p.FirstName); 
else if ("sortField".Equals("LastName")) 
    q = q.OrderBy(p => p.LastName); 
else if ("sortField".Equals("Dob")) 
    q = q.OrderBy(p => p.Dob); 
+0

Dobra odpowiedź. W tym konkretnym przypadku używam odpowiedzi od BobTodda, jednak będę o tym pamiętać w przypadku niektórych dynamicznych zapytań, które wkrótce będę budować. – eyeballpaul