2011-12-13 12 views
5

私はこれを実現するために苦労しています。私はEFの声明を列に入れて注文することを望みます。私の元の文は、このでした:エンティティフレームワークとステートメントによる動的順序

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

そして、私は次のようにこれを変更:

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

sortFieldは、我々は上にソートしたい列であり、すなわちLastName文字列です。しかし、それは動作するようには見えず、ソートも行われず、出力されたSQL文字列は完全に間違っています。誰もが前にこの仕事を得た?あなたは次のタイプを使用してメソッドに式を渡してみてください

答えて

11

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

と、代わりにLINQ式のLINQの拡張機能を使用して...

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

優秀な答えは、この特定のケースでは、これは、より良い解決策だ、私はこれを使用しますので、感謝を。 – eyeballpaul

+0

ここに "asc"と "desc"節を追加する方法はありますか? – eyeballpaul

+0

また、なぜこれは文字列のプロパティで整数ではなく動作しますか?プロパティの1つがInt32で、この順番でソートしようとするとエラーが発生します: "{" 'System.Int32'型を 'System.Object'型にキャストできません。 LINQ to Entitiesは、エンティティデータモデルのプリミティブ型のキャストのみサポートしています。 "}" – eyeballpaul

3

あなたのソートが機能しません。あなたが文字列リテラルをソートしているからです。違法ではありませんが、特に有用ではありません。あなたはこのように、例えば、IQueryable<T>のAPIを介しての並べ替えフィールドを提供する必要があります。

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

この特定のケースでは、私はBobToddの答えを使用していますが、私はすぐに構築するいくつかの動的クエリに対してこれを覚えています。 – eyeballpaul

関連する問題