0

作成したクラス内でクエリ順序付けメソッドを作成しようとしています。

クエリをパラメーターとして渡すたびに、それが注文されることを期待して、次のように書きました。

public static void Ordenar<T>(IEnumerable<T> query, string columna, string orden)
    {
        if (!(String.IsNullOrEmpty(orden) || String.IsNullOrEmpty(columna)))
        {
            if (orden == "ASC") query.OrderBy(x => x.GetType().GetField(columna).GetValue(query));
            if (orden == "DESC") query.OrderByDescending(x => x.GetType().GetField(columna).GetValue(query));
        }
    }

無駄に。私はそれを次のように機能させることができません:

db.Thingys.OrderBy(x=> x.Name);

一般的にクエリを並べ替えたいこのフィールドを「選択」するにはどうすればよいですか? 助けてください。D: ASP.NET MVC3 を使用しています

4

2 に答える 2

2

Dynamic Linq についてはhttp://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspxをご覧ください。文字列に基づいて並べ替えやフィルタリングを指定できます (例: ユーザー入力用)。

于 2012-05-23T17:48:41.147 に答える
1

これを行うべきかどうかのメリットに立ち入ることなく、コードに問題があったことがいくつかあります。

まず、 LINQクエリの結果を返す必要があります。LINQ演算子は、ソースシーケンス自体を変更しません。

次に、columnaパラメータはおそらく、シーケンス自体ではなく、シーケンス内の要素のフィールドの名前に対応します。GetFieldしたがって、ジェネリック型Tと各要素(パラメーターGetValueに割り当てられている)を呼び出す必要があります。x

public static IEnumerable<T> Ordenar<T>(IEnumerable<T> query, 
    string columna, string orden)
{
    if (!(String.IsNullOrEmpty(orden) || String.IsNullOrEmpty(columna)))
    {
        FieldInfo orderField = typeof(T).GetField(columna);

        if (orden == "ASC")
            return query.OrderBy(x => orderField.GetValue(x));

        if (orden == "DESC")
            return query.OrderByDescending(x => orderField.GetValue(x));
    }

    return query;
}
于 2012-05-23T18:29:03.660 に答える