.OrderBy () / .OrderByDescending () с .FirstOrDefault () /. First () - PullRequest
0 голосов
/ 05 июля 2018

У меня есть список результатов из таблицы с именем "product".

Id      User    ProductName     ArrivalDate
----    -----   ------------    ------------
1       James   Shoes           05/07/2016
2       Jenny   TShirt          05/01/2018
3       James   Pants           13/05/2017

Я бы хотел отсортировать результат по убыванию, основываясь на ArrivalDate, где User - «James», что означает, что он должен вернуть мне результат третьей строки. Однако, если я сделаю, как показано ниже:

return List(spec).OrderByDescending(x=>x.ArrivalDate).FirstOrDefault();

результат, который я получил, по-прежнему является первым, буду признателен, если кто-нибудь сможет подсказать это. Ниже приведен пример кода:

public class EfRepository<T> : IRepository<T>, IAsyncRepository<T> where T : BaseEntity
{
    public T GetSingleBySpec(ISpecification<T> spec)
    {
        return List(spec).FirstOrDefault();
    }
}

public class ProductSpecification : BaseSpecification<NewProducts>
{
    public ProductSpecification(string User)
    : base(b => b.User == User) //User = James
    {

    }
}

public class ProductService : IProductService
{
    public void getOrderProductDetails
    {
        var data = _productRepository.GetSingleBySpec(new ProductSpecification(user));
    }
}

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Если вы хотите получить только определенного пользователя в последний раз, вы должны добавить дополнительное условие в пункт where FirstOrDefault генерирует запрос следующим образом:

  Select top 1 ....
0 голосов
/ 05 июля 2018

Мне кажется, что вы пытаетесь инкапсулировать некоторые базовые функции Linq, используя свои собственные методы, но вы только усложняете вещи, в то же время вы делаете их ограниченными и трудными в использовании, а не гибкими и простыми использовать.

Вот что я бы сделал вместо этого:

public void getOrderProductDetails
{
    var data = _productRepository
        .Where(x => x.User == user)
        .OrderByDescending(x => x.ArrivalDate)
        .FirstOrDefault();
    // process data ...
}
0 голосов
/ 05 июля 2018

Я не вижу фильтра для пользователя, а вы заказываете по пользователю. Попробуйте это.

return List(spec).Where(x => x.User == "James")
                 .OrderByDescending(y => y.ArrivalDate)
                 .FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...