C# orderby IQueryable 由 2 个不同的属性 LinQ
C# orderby IQueryable by 2 different properties LinQ
我有一个自定义对象的 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
}
问题是,有些OrgObject没有sortStr(或sortVal)的值,那么应该取LinkedObject的sortStr。
我尝试实现一个单独的 getter 来实现这一点,但 LINQ 不支持它。
我尝试使用:
OrderBy(x => x.LinkedObject.sortStr).ThenBy(y => y.sortStr)
这也不管用。有没有办法用 LINQ 解决这个问题?或者任何其他干净简单的解决方案?或者我需要自己实现吗?
提前致谢
您可以在执行自定义逻辑的 OrgObject 中实现 IComparable<OrgObject>
,无论它是什么,只需执行 .OrderBy(x=>x)
.
假设您想要 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);
我有一个自定义对象的 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
}
问题是,有些OrgObject没有sortStr(或sortVal)的值,那么应该取LinkedObject的sortStr。 我尝试实现一个单独的 getter 来实现这一点,但 LINQ 不支持它。 我尝试使用:
OrderBy(x => x.LinkedObject.sortStr).ThenBy(y => y.sortStr)
这也不管用。有没有办法用 LINQ 解决这个问题?或者任何其他干净简单的解决方案?或者我需要自己实现吗? 提前致谢
您可以在执行自定义逻辑的 OrgObject 中实现 IComparable<OrgObject>
,无论它是什么,只需执行 .OrderBy(x=>x)
.
假设您想要 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);