我有一个IQueryable自定义对象,并希望对它们实现排序。这是我在数据库中的对象的简化形式:
public class OrgObject : Entity
{
public string sortStr { get; set; }
public int sortVal { get; set; }
//... more different properties
public virtual List<LinkedObject> links {get; set;}
}
public class LinkedObject : Entity
{
public string sortStr { get; set; }
public int sortVal { get; set; }
//... more different properties
}
问题是,一些OrgObjects没有sortStr(或sortVal)的值,那么它应该使用LinkedObject的sortStr。 我尝试实现一个单独的getter来实现它,但LINQ不支持它。 我尝试使用:
OrderBy(x => x.LinkedObject.sortStr).ThenBy(y => y.sortStr)
也不起作用。有没有办法用LINQ解决这个问题?或任何其他清洁和简单的解决方案?或者我需要实现自己的? 提前致谢
答案 0 :(得分:1)
假设您想要LinkedObject列表中的第一个或默认选项,那么您可以执行类似的操作。
var ordering = o.OrderBy(x => x.sortStr ?? x.links.FirstOrDefault().sortStr);
这里有完整的例子:
var o = new List<OrgObject>()
{
{
new OrgObject()
{
sortStr = null,
sortVal = null,
links = new List<LinkedObject>()
{
new LinkedObject(){sortStr = "a", sortVal=1},
new LinkedObject(){sortStr = "b", sortVal=2},
}
}
},
{
new OrgObject()
{
sortStr = "c",
sortVal = 3,
links = new List<LinkedObject>()
{
new LinkedObject(){sortStr = "a", sortVal=1},
new LinkedObject(){sortStr = "b", sortVal=2},
}
}
},
{
new OrgObject()
{
sortStr = null,
sortVal = null,
links = new List<LinkedObject>()
{
new LinkedObject(){sortStr = "d", sortVal=1},
new LinkedObject(){sortStr = "e", sortVal=2},
}
}
},
};
var ordering = o.OrderBy(x => x.sortStr ?? x.links.FirstOrDefault().sortStr);
答案 1 :(得分:0)
您可以在OrgObject中实现IComparable<OrgObject>
来执行您的自定义逻辑,无论它是什么,只需执行.OrderBy(x=>x)
。