Linq to Sql -关键字'IS'导致语法错误

本文关键字:语法 错误 IS to 关键字 Sql Linq | 更新日期: 2023-09-27 18:12:07

我正试图在一列上按空值排序,然后按另一列排序,如本文所示。

_ctx.Leads.Include(a => a.LeadAttachments)
    .Where(s => s.Name.ToLower().StartsWith(filter))
    .OrderBy(a=>a.AcceptedOn.HasValue)
    .ThenByDescending(a => a.AssignedOn)
    .Skip(offSet)
    .Take(12)
    .ToList()

当添加.OrderBy(a=>a.AcceptedOn.HasValue)

时,我得到这个错误

类型为"System.Data.SqlClient"的异常。在EntityFramework.Core.dll中发生SqlException',但未在用户代码中处理

附加信息:关键字'IS'附近语法错误。

在FETCH语句中使用NEXT选项无效。

我的两个排序列都是Nullable<DateTime>类型的。

这个查询有什么问题?有没有更好的排序方法?

更新:
感谢@vamsi的回答,我没有这个错误。现在我需要这样排序:
对于AcceptedOn,所有具有null值的记录应首先
所有对两个日期都有值的记录应该按AssignedOn而不是AcceptedOn排序
这可能吗?

Linq to Sql -关键字'IS'导致语法错误

From comment:

,但我真正想要的是首先所有的null acceptedOn,然后休息由assigndon排序。这可能吗

_ctx.Leads.Include(a => a.LeadAttachments)
        .Where(s => s.Name.ToLower().StartsWith(filter))
        .OrderByDescending(a=> a.AcceptedOn == null 
            ? DateTime.MaxValue 
            : a.AssignedOn == null 
                ? a.AcceptedOn 
                : a.AssignedOn)
        .Skip(offSet)
        .Take(12)
        .ToList();

解释代码中的排序优先级

  1. AcceptedOnnull值出现在顶部
  2. 同时具有AcceptedOn AssignedOn值的记录将按AssignedOn降序排序
  3. 只有AcceptedOn值的剩余记录将按降序排列在最后

试试是否可以

 _ctx.Leads.Include(a => a.LeadAttachments)
        .Where(s => s.Name.ToLower().StartsWith(filter))
        .OrderBy(a=>a.AcceptedOn ?? DateTime.MinValue)
        .ThenByDescending(a => a.AssignedOn)
        .Skip(offSet)
        .Take(12)
        .ToList() 

你的问题是你正在使用。hasvalue,它返回一个bool值,当你应该使用。value,它返回实际值,如果不是null。

试试这个,我肯定会成功的。

.OrderBy(a=>a.AcceptedOn.Value)

这就是我的完美工作

_ctx.Leads.Include(a => a.LeadAttachments)
    .Where(s => s.Name.ToLower().StartsWith(filter))
    .OrderByDescending(a=> a.AcceptedOn == null 
        ? DateTime.MaxValue 
        : a.AssignedOn).ThenByDescending(a=>a.AssignedOn)
    .Skip(offSet)
    .Take(12)
    .ToList();

解释:

第一个排序:get null AcceptedOn First
然后:按AssignedOn

排序所有记录