C# 如何使用orderbydescending在linq中进行查询?

C# 如何使用orderbydescending在linq中进行查询?,c#,linq,entity-framework,asp.net-web-api,C#,Linq,Entity Framework,Asp.net Web Api,我正在尝试查询数据,结果按降序排列。 当我询问-- 我得到的结果是从9号开始,而不是16号。我不太清楚这是如何实现的。这就是我目前拥有的: public HttpResponseMessage Get([FromUri] Query query) { var data = db.data_bd.AsQueryable(); int pageSize = 10; if (query.price_type != n

我正在尝试查询数据,结果按降序排列。 当我询问--

我得到的结果是从9号开始,而不是16号。我不太清楚这是如何实现的。这就是我目前拥有的:

 public HttpResponseMessage Get([FromUri] Query query)
    {
            var data = db.data_bd.AsQueryable();

            int pageSize = 10;

            if (query.price_type != null)
            {
                data = data.Where(c => c.Cover == query.price_type);
            }
            if (query.endDate != null)
            {
                data = data.Where(c => c.UploadDate <= query.endDate);
            }

            if (query.startDate != null)
            {
                data = data.Where(c => c.UploadDate >= query.startDate);
            }


            // If any other filters are specified, return records which match any of them:
            var filteredData = new List<IQueryable<data_bd>>();

            if (!string.IsNullOrEmpty(query.name))
            {
                var ids = query.name.Split(',');
                foreach (string i in ids)
                {
                    filteredData.Add(data.Where(c => c.Name != null && c.Name.Contains(i)));
                }
            }

            if (filteredData.Count != 0)
            {
                data = filteredData.Aggregate(Queryable.Union);
            }

            if (!data.Any())
            {
                var message = string.Format("No data was found");
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
            }

            if (query.startDate != null)
            {
               data = data.OrderByDescending(c => c.UploadDate >= query.startDate).Take(pageSize);

            }

            if (filteredData.Count != 0)
            {
                data = data.OrderByDescending(d => d.UploadDate).Take(pageSize);
            }

            //return Request.CreateResponse(HttpStatusCode.OK, data);
        }
公共HttpResponseMessage获取([FromUri]查询) { var data=db.data_bd.AsQueryable(); int pageSize=10; if(query.price_type!=null) { data=data.Where(c=>c.Cover==query.price\u type); } if(query.endDate!=null) { data=data.Where(c=>c.UploadDate c.UploadDate>=query.startDate); } //如果指定了任何其他筛选器,则返回与其中任何筛选器匹配的记录: var filteredData=新列表(); 如果(!string.IsNullOrEmpty(query.name)) { var id=query.name.Split(','); foreach(id中的字符串i) { Add(data.Where(c=>c.Name!=null&&c.Name.Contains(i)); } } 如果(filteredData.Count!=0) { 数据=filteredData.Aggregate(Queryable.Union); } 如果(!data.Any()) { var message=string.Format(“未找到数据”); 返回请求.CreateErrorResponse(HttpStatusCode.NotFound,消息); } if(query.startDate!=null) { data=data.OrderByDescending(c=>c.UploadDate>=query.startDate); } 如果(filteredData.Count!=0) { data=data.OrderByDescending(d=>d.UploadDate).Take(pageSize); } //返回请求.CreateResponse(HttpStatusCode.OK,数据); }
我错过什么了吗?请给我一些建议

您没有按日期订购。。你在用布尔表达式排序

data = data.OrderByDescending(c => c.UploadDate <= query.endDate).Take(pageSize);
//                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bool

data=data.OrderByDescending(c=>c.UploadDate你在这里有点不对劲。首先,如果你对列表重新排序4次,前3次将是浪费时间。我不确定你的逻辑是什么,所以我就不说了。你需要重新考虑你的过滤逻辑

其次,您传递给
OrderByDescending
Func
获取OrderByDescending的键;它不执行过滤。因此,执行此操作时:

data = data.OrderByDescending(c => c.UploadDate >= query.startDate)
如果上载日期在查询开始日期之后,则使用
true
键;如果上载日期在查询开始日期之前,则使用
false
键。因此,您将获得所有
true
键,然后是所有
false
键。您根本不按日期排序

要按日期订购,您需要执行以下操作:

data.Where(c => c.UploadDate >= query.startDate)
    .OrderByDescending(c => c.UploadDate)
这将选择上载日期在查询开始日期之后的所有项目,然后按
UploadDate
排序

我的建议是首先使用
Where
应用每个过滤器,然后在最后执行
OrderByDescending(c=>c.UploadDate)
(或您计划使用的任何属性)进行排序。

您尝试过这个吗

data.Where(c => c.UploadDate >= query.startDate).OrderByDescending(c => c.UploadDate)

我认为您可能正在尝试在这些日期之间进行筛选,然后按日期降序排序。请尝试以下方法:

       if (query.endDate != null)
        {
            data = data.Where(c => c.UploadDate <= query.endDate).Take(pageSize);
        }

        if (query.startDate != null)
        {
           data = data.Where(c => c.UploadDate >= query.startDate).Take(pageSize);

        }

        data = data.OrderByDescending(c => c.UploadDate);
if(query.endDate!=null)
{
data=data.Where(c=>c.UploadDate c.UploadDate>=query.startDate).Take(pageSize);
}
data=data.OrderByDescending(c=>c.UploadDate);

hi,无论使用哪种选择条件,我都尝试按UploadDate降序排序。如果我在where子句末尾添加orderby,这将与上述count变量冲突。count变量用于在“Take(10)”之前计算查询的查询记录“。如果可能,请提供建议。您好,非常感谢您的详细解释和帮助。我使用此线程上发布的建议更新了代码,但我有一个小问题,count variable count。如果可能,您能否提供一些有关此问题的建议或反馈。请查看上面的更新代码。@user3070072这听起来像一个单独的问题。如果是这样,你应该发布一个新的问题;否则这个问答会变得模棱两可,让未来的用户感到困惑。
       if (query.endDate != null)
        {
            data = data.Where(c => c.UploadDate <= query.endDate).Take(pageSize);
        }

        if (query.startDate != null)
        {
           data = data.Where(c => c.UploadDate >= query.startDate).Take(pageSize);

        }

        data = data.OrderByDescending(c => c.UploadDate);