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
排序
这可能吗?
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();
解释代码中的排序优先级
-
AcceptedOn
的null
值出现在顶部 - 同时具有
AcceptedOn
和AssignedOn
值的记录将按AssignedOn
降序排序 - 只有
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