.OrderBy()/ .OrderByDescending()与.FirstOrDefault()/。First()

时间:2018-07-05 14:03:02

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

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

     <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="line">
            <stroke android:width="5dp"
                android:color="#698cc8"
                />
        </shape>
    </item>
</selector>

我想根据ArrivalDate降序对结果进行排序,其中User是“ James”,这意味着它应该返回给我第三行结果。 但是,如果我执行以下操作:

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

我得到的结果仍然是第一个,如果有人可以指导的话,请感到满意。 下面是示例代码:

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

  Select top 1 ....

答案 2 :(得分:0)

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

这就是我要做的:

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

答案 3 :(得分:0)

您也可以在“ 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));