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);