1

以下の機能を取得したい。しかし、異なるデータ型を返す必要があるため、このメソッドは許可されていません。この文脈で私は何をしますか?

.OrderBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return X.a.CreatedOn;
                   case "BookCategoryName":
                      return X.a.BookCategoryName;
                   case "BookCategoryDescription":
                      return X.a.BookCategoryDescription;
                }
                return X.a.CreatedOn;
             });

または、この機能を取得するための他の提案はありますか?

4

3 に答える 3

3

ラムダでそのようなロジックを作成する代わりに、ロジックを変更してクエリを作成することをお勧めします。

次のようなクエリを作成します。

var query = list.Where(...);

if(OrderByColumn=="BookCategoryName")
{
   query = query.OrderBy(x=>x.a.BookCategoryName);
}
....

最後に:

var result = query.ToList(); //for e.g.

それはあなたが望むように機能し、よりきれいに見えます

于 2013-10-22T06:29:13.193 に答える
1

,別のオプションは、次のように、順序付けフィールドの選択自体を別のメソッドに抽出することです。

public IEnumerable<Data> SelectData(IEnumerable<Data> data, Func<Data, bool> predicate)
{
    return data
        .Where(predicate)
        .OrderBy(GetCurrentOrderingField);
}

private IComparable GetCurrentOrderingField(Data x)
{
    switch (OrderByColumn)
    {
        case "BookCategoryName":
            return x.a.BookCategoryName;

        case "BookCategoryDescription":
            return x.a.BookCategoryDescription;
    }

    return x.a.CreatedOn;
}

もちろん、これはIComparableインターフェイスを実装するフィールドの場合です。

于 2013-10-22T06:48:15.017 に答える
1

現在のラムダが返す可能性のあるデータ型ごとに、個別のブロックを使用して順序を定義し、その戻り値の型を使用しないオプションについては、定数を返します。

今のところ、これCreatedOnDateTimeandBookCategoryNameBookCategoryDescription文字列であると仮定すると、次のようになります。

.OrderBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return X.a.CreatedOn;
                   case "BookCategoryName":
                      return new DateTime(1900,1,1);
                   case "BookCategoryDescription":
                      return new DateTime(1900,1,1);
                }
                return X.a.CreatedOn;
             })
.ThenBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return "";
                   case "BookCategoryName":
                      return X.a.BookCategoryName;
                   case "BookCategoryDescription":
                      return X.a.BookCategoryDescription;
                }
                return "";
             });

(もちろん、定数値は実際の定数や変数などに移動できますが、上記のスニペットを自己完結型にしたかったのです)

于 2013-10-22T06:33:17.903 に答える