OrderBy子属性linq to sql

时间:2018-09-24 14:40:52

标签: c# entity-framework linq linq-to-sql

有人可以帮助我在linq to sql中订购嵌套集合。请参阅下面的示例:

    public class A
    {
        public int Id { get; set; }
    }

    public class B
    {
        public virtual ICollection<A> ListA { get; set; }
    }

从数据库中调用数据:

_unitOfWork.DbContext.B
            .OrderByDescending(ev => ev.ListA.OrderBy(a => a.Id))
            .ToList();

我的情况是ListA不为空时,一切正常。但是,如果列表A为空,我会得到一个例外,说明至少一个对象需要实现IComparable。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您不能按空订单。 null显然不会实现IComparable。 在orderby之前添加where子句以检查listA是否不为空。

_unitOfWork.DbContext.B
        .Where(ev => ev.ListA != null)
        .OrderByDescending(ev => ev.ListA.OrderBy(a => a.Id))
        .ToList();

答案 1 :(得分:0)

如果目标是在清单A中包含B,则B具有空集合,然后B具有Null引用。
使用同时排序的ListA,您可以检查空列表和空列表,然后根据该列表进行排序。

var Bs = new[] {
    new B{ListA = new []{ new A { Id = 3 },new A { Id = 1 },new A { Id = 2 }} }
    ,new B{ListA = new List<A>{} }
    ,new B{ListA = null }
};

var result = Bs.Select(b =>
                {
                    int i = 0;
                    if (b.ListA == null)
                    {
                        i = 2;
                    }
                    else if (!b.ListA.Any())
                    {
                        i = 1;
                    }
                    else {
                        b.ListA = b.ListA.OrderBy(a => a.Id).ToList();
                    }
                    return new { oIndex = i, value = b };
                })
                .OrderByDescending(x => x.oIndex)
                .Select(g => g.value);

您说:“当ListA不为空时,一切正常” ;我不确定如何。因为下面的代码将抛出没有任何null或空集合的情况。

var Bis = new[] {
            new B{ListA = new []{ new A { Id = 3 },new A { Id = 1 },new A { Id = 2 }} }
            ,new B{ListA = new []{ new A { Id = 3 },new A { Id = 1 }} }
            ,new B{ListA = new []{ new A { Id = 999 }} }
            ,new B{ListA = new []{ new A { Id = 3 },new A { Id = 1 },new A { Id = 2 },new A { Id = 4 }} }
        };
var result = Bis.OrderByDescending(ev => ev.ListA.OrderBy(a => a.Id)).ToList();

如果您要比较列表,则需要将它们与某物进行比较。 {1,2,3}是否大于{1,1,1,1}? {1,2,3}与{999,999}相比如何? {2}和{1,1}?因为它有更多元素?价值更大?如果一个拥有更大的价值,而另一个拥有的总和却大两倍呢?对于2的0列表。.您是否基于求和值?