C#orderby IQueryable由2个不同的属性LinQ

时间:2017-06-13 08:46:17

标签: c# linq sorting iqueryable

我有一个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解决这个问题?或任何其他清洁和简单的解决方案?或者我需要实现自己的? 提前致谢

2 个答案:

答案 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)