1

20 歳以上のすべての人を選択するためのオブジェクト クエリへの LINQ があります。

IEnumerable<Object> result = null;
result = (from person in AllPersons.ToList()
          where  person.age > 20
                  select new
                  {
                      FirstName= person.FirstName,
                      LastName= person.LastName,
                      Email= person.Email,
                      PhoneNumber= person.PhoneNumber


                  });
return result;

string SortPropertyプロパティに基づいて結果をソートするために使用したいパラメーターがあります。

たとえば、SortProperty="FirstName"名前に基づいて結果を並べ替えたい場合などです。

私は次のことをしようとしました:

return result.OrderBy(x => x.GetType().GetProperty(SortProperty));

しかし、それはうまくいきませんでした

それを行う方法はありますか?

PS: すべての可能性をテストしたくはありません。それぞれに対して if-else を実行したり、大文字と小文字を切り替えたりします。これを行う効率的な方法を探しています

ありがとう

4

4 に答える 4

2

動的 Linq 拡張ライブラリを確認してください...

stringプロパティの代わりに sを受け入れる拡張メソッドがあります。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

あなたSortPropertyはすでにstringあなたができるので

var result = (from person in AllPersons.ToList()
              where  person.age > 20
              select new
                     {
                        FirstName= person.FirstName,
                        LastName= person.LastName,
                        Email= person.Email,
                        PhoneNumber= person.PhoneNumber
                     }
              ).OrderBy(SortProperty);

return result;

また、内容によっては、最後までAllPersons呼び出して列挙しても意味がない場合があります。ToList()例えば

var result = (from person in AllPersons
             ...
             ).OrderBy(SortProperty).ToList();
于 2012-05-18T08:51:02.510 に答える
1

試す

return result.OrderBy(x => x.GetType().GetProperty(SortProperty).GetValue(x, null));
于 2012-05-18T08:56:56.947 に答える
0

私はこのようなものを使用しています:

var sortExpression = @"A,C";
var expressions = sortExpression.Split(new[] { ',' });

var cmpPredicates = new Dictionary<string, Func<Person, Person, int>>(3);
cmpPredicates.Add(@"A", (x, y) => x.A.CompareTo(y.A));
cmpPredicates.Add(@"B", (x, y) => x.B.CompareTo(y.B));
cmpPredicates.Add(@"C", (x, y) => x.C.CompareTo(y.C));
cmpPredicates.Add(@"Default", (x, y) => x.Id.CompareTo(y.Id));

var currentPredicates = new Func<Person, Person, int>[expressions.Length + 1];
for (int i = 0; i < expressions.Length; i++)
{
    currentPredicates[i] = cmpPredicates[expressions[i]];
}
// Default sort order
currentPredicates[currentPredicates.Length - 1] = cmpPredicates[@"Default"];

persons.Sort((x, y) =>
                {
                    var cmp = 0;

                    var index = 0;
                    while (cmp == 0 && index < currentPredicates.Length)
                    {
                        cmp = currentPredicates[index++](x, y);
                    }

                    return cmp;
                });

Person クラスには次の定義があります。

public class Person
    {
        public string A { get; set; }
        public string B { get; set; }
        public string C { get; set; }

        public long Id { get; set; }

        public Person()
        {
            this.A = string.Empty;
            this.B = string.Empty;
            this.C = string.Empty;
        }
    }

主な利点は、マルチプロパティのサポートです。追加のチェック (重複 & 存在 & 述語制限) を使用すると、ユーザーが提供できます。

于 2012-05-18T09:25:55.837 に答える
0
return result.OrderBy( x => TypeHelper.GetPropertyValue( x, sortProperty ) )
           .ToList();
于 2012-05-18T08:52:27.963 に答える