我有一个具有Object类型属性的类。
class Test
{
public Object obj { get; set; } // This "obj" can be of type Test1 or other type
.....
}
class Test1
{
public int a = 1;
public int b = 2;
}
List<Test> myList = new List<Test>{new Test() {obj = new Test1()}} // This contains some values.
现在我想基于“obj”值对“myList”进行排序,并使用以下方式动态识别排序字符串:
myList.AsQueryable().OrderBy("obj.a ascending, obj.b descending");
这是我收到错误的时候。我尝试了类型转换,但这没有帮助。
答案 0 :(得分:1)
在LINQ中排序的方法是:
var sortedList = myList.OrderBy(obj => obj.a).ThenByDescending(obj => obj.b).ToList();
如果问题标题中的“动态”是指在运行时构建您的条件,也许您应该查看Dynamic LINQ。
答案 1 :(得分:1)
我有类似的错误,但在我的情况下,我只有一个对象列表(List),我不得不动态排序。我使用activator创建了一个对象类型的IList实例,添加了所有对象,然后动态地对它进行了排序。
答案 2 :(得分:0)
编译器不知道obj
是什么,因为它的类型为Object
。
解决此问题的唯一方法是在您的类型上实现一个具有公共a
和b
或使用dynamic
而不是Object
的界面。但是,除非绝对必要,否则使用dynamic
并不是解决这些问题的最佳方式。
答案 3 :(得分:0)
第一件事是myList
期望Test
类型的对象不是Test1
。您需要像{/ p>这样设置obj
Test
属性的值
List<Test> myList = new List<Test>{new Test(){ obj=new Test1() }};
现在您要对Test1
对象应用排序,因此您需要将该对象转换为Test1
类型,然后应用排序。
myList.OrderBy(x => ((Test1)x.obj).a).OrderByDescending(x => ((Test1)x.obj).b);