14

私はより大きな/より複雑な問題を抱えていますが、簡単にするために、次のことを考えてみましょう:

ID (int, primary key)Name (varchar/string)の 2 つの列を持つProductというSQL データベースにテーブルがあるとします。シンプルなLINQ DataContextもあります。

クエリを作成し、「my」関数に渡しました。次のようなものだとしましょう: (もう少し複雑かもしれませんが)

IQueryable<Product> query = from p in db.Products select p;

メソッドがこのクエリを取得し、パラメーターとして渡されたら、並べ替え順序を変更する必要があります。

IQueryable<Product> sortedQuery = query.OrderBy(x => x.Name);

これをより一般的なものにしたいと思います。つまり、ソートするフィールドを指定したいと思います。通常、switch文字列を取るステートメントを実行できます。ただし、パラメータを直接渡す方法があるかどうかを知りたいです。これを他のデータベース テーブルに拡張するつもりなので、これらのswitchステートメントは面倒になります。

私は次のようなことを試みていました:

IQueryable<Product> sortedQuery = query.OrderBy(x => (typeof(Product)).GetProperty(“Name”));

しかし、これはうまくいきません。また、LINQ to SQL が維持されること、つまり SQL Server で実行される並べ替えが確実に行われるようにしたいと考えています。したがって、デバッグすると、この LINQ クエリから SQL クエリを取得する必要があります。

よろしくお願いいたします。

4

3 に答える 3

19

Dynamic Linqこの目的で使用できます。

ここを参照してください動的 LINQ (パート 1: LINQ 動的クエリ ライブラリの使用)

次に、次のような呼び出しを行うことができます。

var query = DBContext.Users.Where( "Age > 3" ).OrderBy( "Name asc" );
于 2013-03-13T15:16:04.913 に答える
11

代わりにこれを試してください:

query.OrderBy(x => x.GetType().GetProperty(“Name”).GetValue(x, null));

あなたはただ財産をつかむことはできません。そのプロパティから値を取得する必要があるため、を呼び出しますGetValue

于 2013-03-13T14:35:53.177 に答える
1

見た目ほど簡単ではありません。OrderByLINQ to SQL エンジンは、参照しているプロパティの名前を取得するためにメソッドに渡された式を解析し、この情報を使用してプレーンな SQLorder by句を作成します。

とにかく、リフレクションを使用してそれを行うことができると思います。たぶん、この SO questionの受け入れられた答えから何か役に立つものを得ることができます。

于 2013-03-13T15:00:39.727 に答える