OrderBy детская собственность linq to sql - PullRequest
0 голосов
/ 24 сентября 2018

Может ли кто-нибудь помочь мне с заказом вложенной коллекции в linq для 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 голосов
/ 25 сентября 2018

Если цель состоит в том, чтобы иметь B с Нечто в ListA, затем B с пустой коллекцией, затем B с нулевой ссылкой.
С помощью 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 не пустой, все работает нормально" ;Я не уверен, чтобы понять, как.Поскольку следующий код будет выдан без какой-либо нулевой или пустой коллекции.

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 списка 0s .. вы основываете свое сравнение на сумму и значение?

0 голосов
/ 24 сентября 2018

Вы не можете заказать по нуля.null не реализует IComparable, очевидно.Добавьте предложение where перед заказом, чтобы проверить, не равен ли значение listA нулю.

_unitOfWork.DbContext.B
        .Where(ev => ev.ListA != null)
        .OrderByDescending(ev => ev.ListA.OrderBy(a => a.Id))
        .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...