6

私はsortパラメーターをチェックし、一連のifステートメントを作成しています。

if (sortDirection == "ASC")
{
    if (sortBy == "Id")
        return customerList.OrderBy(x => x.Id).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "FirstName")
        return customerList.OrderBy(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "City")
        return customerList.OrderBy(x => x.City).Skip(startIndex).Take(pageSize).ToList();
}
else
{
    if (sortBy == "Id")
        return customerList.OrderByDescending(x => x.Id).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "FirstName")
        return customerList.OrderByDescending(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "City")
        return customerList.OrderByDescending(x => x.City).Skip(startIndex).Take(pageSize).ToList();
}

どうすればこれを改善できますか?

4

3 に答える 3

8

順序とクエリの残りの部分を分離します-コードベースで複製する必要のない各クエリで同じ部分(DRYのままにします):

var query = customerList;

if (sortDirection == "ASC")
{
    if (sortBy == "Id")
       query = query.OrderBy(x => x.Id);
    ///and so on
}

query = query.Skip(startIndex).Take(pageSize).ToList();
于 2012-05-11T19:50:04.950 に答える
2

リフレクションを使用する:)

customerList = (sortDirection == "ASC")
   ? customerList
        .OrderBy(x => x.GetType().GetProperty(sortBy).GetValue(x, null))
        .Skip(startIndex)
        .Take(pageSize)
        .ToList()
   : customerList
        .OrderByDescending(x => x.GetType().GetProperty(sortBy).GetValue(x, null))
        .Skip(startIndex)
        .Take(pageSize)
        .ToList();
于 2012-05-11T19:50:35.323 に答える
1

プロパティ名で文字列として並べ替えるだけのようです。この場合、これは実際には「動的LINQ」を使用してすでに解決されています。

IEnumerable<T>での動的LINQOrderBy

この質問の答えを見てください。問題を解決するためのサンプルコードが提供されているはずです。

于 2012-05-11T19:52:34.920 に答える