0

オブジェクトがビュー内にグリッド (テーブル) を構築する Linq クエリを作成しています。

filteredProducts =
    filteredProducts.Take(take)
                    .Skip(pagesToSkip)
                    .OrderBy(w => w.ProductName)
                    .ToList();

非常に一般的なパターンに従って; グリッドは、クリックされた列ヘッダーに応じて異なる列を「OrderBy」できます。可能な列名を含めることができるように、ハードコードされた「ProductName」を置き換える必要があります。解決策はおそらくこの質問で提示されたアプローチに基づいていますが、私のユースケースは十分に異なっているため、まだ何も実装できていません。SOの自動提案は、これが一般的な問題であるため、奇妙に思われる他の明白なものを提供していません。

私は明白なことを試しました:

var mySortColumn = "w.ProductId";

それから:

.OrderBy(w => mySortColumn)

コンパイルや実行時の苦情はありませんが、指定された値も尊重されません。私が試した他のバリエーションでは、すぐにコンパイラ エラーが発生します。

この記事では、SWITCH/CASE コンストラクトを使用して、考えられる「OrderBy」句ごとにまったく異なるクエリを作成することを提案しています。私は通常、ハックで鼻を上げる人ではありませんが。イク。

動的 SQL の時代の「文字列を構築する」時代からそれほど進化していないように見えます。

4

1 に答える 1

0

OrderByメソッドはFunc<Type,int>デリゲートを受け取ります。これは、次のようなことができることを意味します。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{

    static void Main(string[] args)
    {
        var foos = new List<Foo>()
        {
            new Foo { A = 1, B = 2 },
            new Foo { A = 2, B = 1 }
        };

        Func<Foo, int> a = f => f.A;
        Func<Foo, int> b = f => f.B;

        bool orderByA = false;

        Display(foos.OrderBy(orderByA ? a : b));
    }

    private static void Display(IEnumerable<Foo> foos)
    {
        foos.ToList().ForEach(f => Console.WriteLine(f));
    }
}

class Foo
{
    public int A { get; set; }
    public int B { get; set; }

    public override string ToString()
    {
        return A + " " + B;
    }
}

本当にプロパティ名でソートできるようにしたい場合は、Expressionから を作成するコードを作成する必要がありますstring

于 2013-04-10T18:59:26.957 に答える