1

我有一个 LINQ 对象查询来选择所有 20 岁以上的人

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 扩展库...

它具有接受strings 而不是属性的扩展方法。

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
return result.OrderBy( x => TypeHelper.GetPropertyValue( x, sortProperty ) )
           .ToList();
于 2012-05-18T08:52:27.963 回答
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 回答