【问题标题】:.OrderBy() / .OrderByDescending() with .FirstOrDefault()/.First().OrderBy() / .OrderByDescending() 和 .FirstOrDefault()/.First()
【发布时间】:2018-07-05 14:03:02
【问题描述】:

我有一个名为“产品”的表的结果列表。

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

我想根据 ArrivalDate 的降序对结果进行排序,其中用户是“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));
    }
}

【问题讨论】:

  • 嗨@maccettura 我已经编辑了代码,因为它输入错误。

标签: c# asp.net entity-framework linq web-services


【解决方案1】:

我没有看到用户的过滤器,您正在按用户订购。试试这个。

return List(spec).Where(x => x.User == "James")
                 .OrderByDescending(y => y.ArrivalDate)
                 .FirstOrDefault();

【讨论】:

  • Bob K,还是一样
  • 我的 .OrderByDesecending 中可能的类型-o。我将 x 更改为 y。你能再试一次吗?
【解决方案2】:

如果您只想获取特定用户的最后到达时间,您应该在 where 子句中添加额外的条件 FirstOrDefault 会生成这样的查询:

  Select top 1 ....

【讨论】:

    【解决方案3】:

    在我看来,您正在尝试使用自己的方法封装一些基本的Linq 功能,但您只会使事情复杂化,同时您会使其受限且难以使用,而不是灵活和简单使用。

    我会这样做:

    public void getOrderProductDetails
    {
        var data = _productRepository
            .Where(x => x.User == user)
            .OrderByDescending(x => x.ArrivalDate)
            .FirstOrDefault();
        // process data ...
    }
    

    【讨论】:

      【解决方案4】:

      您也可以将“过滤器”~放在 FirstOrDefault 方法中。

      我在下面展示了一个通用示例(两种方式)。

      还要注意不区分大小写的字符串比较。

      ICollection<Employee> employees = (blah blah blah);
      
      
      Employee firstEmployeeWhereClause = employees.Where(z => z.LastName.Equals("Smith", StringComparison.OrdinalIgnoreCase)).OrderByDescending(x => x.EmployeeSurrogateKey).FirstOrDefault();
      
      
      Employee secondEmployeeNoWhereClause = employees.OrderByDescending(x => x.EmployeeSurrogateKey).FirstOrDefault(z => z.LastName.Equals("Smith", StringComparison.OrdinalIgnoreCase));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多