Условный заказ EF Core 3.0 выполняется в LINQ, когда условие проверяется в БД - PullRequest
2 голосов
/ 01 ноября 2019

Ниже приведен довольно простой пример проблемы, которую мне нужно решить. Я использую EF Core 3.0, а с LINQ мне нужно получить всех парней из базы данных в определенном порядке. Сначала мне нужны все парни, у которых Feature class и свойство Until больше DateTime.Now, упорядоченное по свойству At по убыванию, а затем по свойству Id по убыванию Guy class.

public class Guy
{
    public int Id {get;set;}
    public Feature Feature {get;set;}
}
public class Feature
{
    public int Id {get;set;}
    public DateTime? At {get;set;}
    public DateTime? Until {get;set;}
}

_dbcontext.Guys.Add(new Guy{Id = 1, Feature = new Feature {At = DateTime.Now.AddDays(-1), Until = DateTime.Now.AddDays(7)}})
_dbcontext.Guys.Add(new Guy{Id = 2, Feature = new Feature {At = DateTime.Now.AddDays(3), Until = DateTime.Now.AddDays(7)}})
_dbcontext.Guys.Add(new Guy{Id = 3})
_dbcontext.Guys.Add(new Guy{Id = 4})

Пример _dbcontext.Guys.Include(x => x.Feature).OrderByDescending(x => x.Feature.Until > DateTime.Now ? x.Feature.At : DateTime.Now).ThenByDescending(x => x.Id).ToList(); должен вернуть Guy с Id 1 первым, так как свойство Feature.At больше DateTime.Now, а остальные должны быть отсортированы по убыванию Id. Id 4, Id 3 затем Id 1.

К сожалению, этот пример работает, но проблема в том, что сначала он вернет те, у которых нет Feature class (упорядочено по убыванию Id свойство), то те, которые имеют Feature class, где At больше DateTime.Now. Опять же, они упорядочены по свойству Until правильно, но они должны быть сверху.

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 01 ноября 2019

См. LINQ порядок по нулевому столбцу, где порядок возрастает, а значения NULL должны быть последними

Добавить условие для фильтрации, если значение равно нулю или нет. См. Приведенный выше пост, например.

_dbcontext.Guys
.Include(x => x.Feature)
.OrderByDescending(x => x.Feature != null)
.ThenBy(x => x.Feature.Until > DateTime.Now ? x.Feature.At : DateTime.Now)
.ThenByDescending(x => x.Id).ToList();

Редактировать:

_dbcontext.Guys
.Include(x => x.Feature)
.OrderByDescending(x => x.Feature!= null && x.Feature.Until > DateTime.Now ? x.Feature.At : DateTime.Now)
.ThenByDescending(x => x.Id).ToList();

Я запустил это в консольном приложении, и оно вышло 2,4,3,1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...