2011-12-13 33 views
5

Bu çalışma için mücadele ediyorum. Sipariş vermek için bir sütunda bir EF ifadesinin olması dileğiyle. Benim asıl ifadesi şuydu:Entity Framework ve anlatımlara göre dinamik sıralama

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

Ve şu bu değiştirdi:

sortField biz sıralamak istiyoruz sütun ve bir dize yani LastName olduğunu
var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby sortField 
        select P; 

. Ancak, işe yaramaz, sıralama yapmaz ve çıktılanmış SQL dizesi tamamen yanlıştır. Bunu daha önce çalışan var mı?

cevap

11
aşağıdaki türde ile yöntemine bir ifadedeki geçen deneyebilirsiniz

: ... linq uzantıları yerine linq ifadeler kullanarak sonra

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

ve

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

Mükemmel cevap, bu özel durumda, bu daha iyi bir çözüm gibi görünüyor ben kullanmasını sağlayabilirsiniz, teşekkürler. – eyeballpaul

+0

Burada "asc" ve "desc" deyimine ekleme yapmanın bir yolu var mı? – eyeballpaul

+0

Ayrıca, bu neden dize özellikleriyle çalışır ve tamsayılarla çalışmaz? Özelliklerden biri bir Int32'dir ve bu sırada sıralamayı denediğimde hatayı alıyorum: "{" 'System.Int32' türünü 'System.Object' türüne yazmak için açılamıyor. Varlıklardan LINQ, yalnızca Varlık Veri Modeli ilkel türlerini yayınlamayı destekler. "}" – eyeballpaul

3

Kişisel sıralama çalışmıyor çünkü bir dizgeyi literal olarak sıralıyorsunuz. Bu yasadışı değildir, ancak özellikle yararlı değildir. Böyle Örneğin, IQueryable<T> ait API üzerinden bir sıralama alanı sağlamanız gerekir:

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

İyi yanıt. Bu özel durumda BobTodd'un cevabını kullanıyorum, ancak yakında inşa edeceğim dinamik soruların bazılarını aklımda tutacağım. – eyeballpaul