Упорядочить по нескольким свойствам с linq to sql - PullRequest
0 голосов
/ 22 марта 2019

У меня есть список, который я хочу заказать следующим образом:

public class Refund {
    public int RefundStatus { get; set; }
    public DateTime SumbitTime { get; set; }
}

Сначала выберите RefundStatus, затем:

, если RefundStatus == 1, затем SumbitTime по возрастанию,

если RefundStatus != 1, то по SumbitTime по убыванию.

Как мне сделать linq to sql?

ОБНОВЛЕНИЕ: я внес изменения, после чего Michal Turczyn. Но вывод вывода журнала не может быть переведен

Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'orderby [p] .RefundStatusasc, ([p] .SumbitTime.Ticks * Convert (IIF (([p] .RefundStatus == 1), 1, -1), Int64)) asc, EF.Property (? [p] ?, "Id") asc 'не может быть переведен и будет оцениваться локально.Microsoft.EntityFrameworkCore.Query: Внимание! Выражение LINQ 'orderby [p] .RefundStatus asc, ([p] .SumbitTime.Ticks * Convert (IIF (([p] .RefundStatus == 1), 1, -1),Int64)) asc, EF.Property (? [P] ?, "Id") asc 'не может быть переведен и будет оцениваться локально.

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Я бы сделал это следующим образом:

List<Refund> refundList = new List<Refund>();
// populate your list
refundList = refundList
    // here you could also use:
    //.OrderBy(r => r.RefundStatus)
    // but I don't know if you want it this way
    .OrderBy(r => (r.RefundStatus == 1 ? 1 : -1))
    .ThenBy(r => r.SubmitTime.Ticks * (r.RefundStatus == 1 ? 1 : -1))
    .ToList();

Идея состоит в том, что когда вы умножите на -1 количество тиков в вашем DateTime, он упорядочит его в порядке убывания без необходимостиразделите вашу коллекцию на две части.

0 голосов
/ 22 марта 2019

Вы можете использовать следующее.

var sorted = list.GroupBy(refund => refund.RefundStatus)
                 .OrderBy(x=>x.Key)
                 .SelectMany(
                             group => group.Key == 1 ? 
                             group.OrderBy(p => p.SubmitTime)
                             : group.OrderByDescending(p => p.SubmitTime));

Полный пример.

        var random = new Random();
        var list = Enumerable.Range(1, 10)
            .Select(x => 
                new Refund
                {
                    RefundStatus = random.Next(0,2),
                    SubmitTime = DateTime.Now.AddMinutes(x)
                });

Где Возврат определяется как

public class Refund
{
    public int RefundStatus { get; set; }
    public DateTime SubmitTime { get; set; }
}

Пример вывода

** Перед сортировкой

Refund = 0 - SubmitTime = 22-03-2019 14:22:16
Refund = 1 - SubmitTime = 22-03-2019 14:23:16
Refund = 0 - SubmitTime = 22-03-2019 14:24:16
Refund = 0 - SubmitTime = 22-03-2019 14:25:16
Refund = 0 - SubmitTime = 22-03-2019 14:26:16
Refund = 1 - SubmitTime = 22-03-2019 14:27:16
Refund = 0 - SubmitTime = 22-03-2019 14:28:16
Refund = 1 - SubmitTime = 22-03-2019 14:29:16
Refund = 0 - SubmitTime = 22-03-2019 14:30:16
Refund = 1 - SubmitTime = 22-03-2019 14:31:16

После сортировки

Refund = 0 - SubmitTime = 22-03-2019 14:31:16
Refund = 0 - SubmitTime = 22-03-2019 14:29:16
Refund = 0 - SubmitTime = 22-03-2019 14:28:16
Refund = 0 - SubmitTime = 22-03-2019 14:26:16
Refund = 0 - SubmitTime = 22-03-2019 14:23:16
Refund = 1 - SubmitTime = 22-03-2019 14:22:16
Refund = 1 - SubmitTime = 22-03-2019 14:24:16
Refund = 1 - SubmitTime = 22-03-2019 14:25:16
Refund = 1 - SubmitTime = 22-03-2019 14:27:16
Refund = 1 - SubmitTime = 22-03-2019 14:30:16
0 голосов
/ 22 марта 2019

Это должно сделать то, что вы ищете, если я правильно понимаю ваш вопрос.

var sorted = refundList.GroupBy(refund => refund.RefundStatus)
    .SelectMany(
        group => group.Key == 1 
        ? group.OrderBy(p => p.SumbitTime)
        : group.OrderByDescending(p => p.SumbitTime))
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...