linq 运算符< =不能应用于datetime和dateonly的操作数

0s7z1bwu  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(125)

我有一些C#代码,可以移植到SQL。C#代码编译并按预期工作。
我尝试将其复制到LinqPad,以查看生成的SQL,但我得到错误

  • “运算符<=不能应用于DateTime和DateOnly的操作数”*

我试图导入一些名称空间,认为这可能会引起一些混乱,但没有帮助。
转换中的简短C#代码是

from o in organisations
where reference = ref
&& o.SubscriptionStartDate <= o.SubscriptionEndDate 
order by....
select o....

字符串
我把这个复制到LinqPad,那就是我得到错误的时候。
经过一些研究,我相信SQL语法是使用之间(参考https://www.w3schools.com/sql/sql_between.asp),但我想知道为什么LinqPad是发出这个错误摆在首位?
其他日期类型也会出现类似的错误,例如o.SubscriptionEndDate.Value.Date,所以我不确定这是否都是链接的。
有谁能解释一下我需要做些什么来消除这个错误吗?

mnemlml8

mnemlml81#

你的代码的问题是没有重载<=操作符,它接受一个DateTime类型的操作数和另一个DateOnly类型的操作数。请注意,这纯粹是C#编译器级别的编译错误,还有另一个(可能的)与代码运行时执行相关的问题,在我的回答的底部讨论。
如果你想用<=运算符比较一个DateTime类型的值和一个DateOnly类型的值,你需要转换两个值中的一个。
an overload of the <= operator,它允许比较2个DateTime类型的值还有an overload of the <= operator,它允许比较2个DateOnly类型的值。你必须将2个值中的一个转换为另一个类型,并使用上述操作符之一。
在您的情况下,正确的做法可能是将DateTime值转换为DateOnly值,该值对应于提供的DateTime值的日期部分。您可以使用DateOnly.FromDateTime(DateTime) method来完成此操作。
我不知道o.SubscriptionStartDateo.SubscriptionEndDate中的哪一个是DateTime类型。让我们假设,作为一个例子,o.SubscriptionStartDateDateTime类型;在这种情况下,您可以将代码更改为以下内容:

from o in organisations
where reference = ref
&& DateOnly.FromDateTime(o.SubscriptionStartDate) <= o.SubscriptionEndDate

字符串
这个版本的代码将编译,因为在这种情况下,您正在使用overload of the <= operator which allows to compare 2 values of type DateOnly
如果你的代码将LINQ目标指向对象,这将足以使你的代码在运行时也能工作。您的LINQ代码用于对数据库执行查询,您需要尝试并验证LINQ提供程序是否能够翻译您的C#如果你得到一个运行时错误,你需要验证你分配给你的对象模型的属性的类型是根据您在数据库级别使用的类型选择正确的类型。
例如,如果您使用SQL Server,并且在数据库上对SubscriptionStartDateSubscriptionEndDate列都使用了datetime2 T-SQL type,那么只需对对象模型中的两个属性都使用System.DateTime类型:这样您的代码将在编译时无需更改,并且在运行时也可以工作。

相关问题