有人可以帮助我在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。有办法解决这个问题吗?
答案 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列表。.您是否基于求和值?