C# Linq到实体SqlFunctions:如何从int转换为double?还是十进制?
我正在尝试使用LINQtoEntities对一些文章进行排序。我正在使用System.Data.Objects.SqlClient.SqlFunctions。这就是我想要的:C# Linq到实体SqlFunctions:如何从int转换为double?还是十进制?,c#,.net,entity-framework,linq-to-entities,sql-function,C#,.net,Entity Framework,Linq To Entities,Sql Function,我正在尝试使用LINQtoEntities对一些文章进行排序。我正在使用System.Data.Objects.SqlClient.SqlFunctions。这就是我想要的: this.Queryable = this.Queryable .OrderByDescending(v => v.UpVote + SqlFunctions.Log10( SqlFunctions.DateDiff("d", DateTime.Today, v.Created))); 但是
this.Queryable = this.Queryable
.OrderByDescending(v => v.UpVote + SqlFunctions.Log10(
SqlFunctions.DateDiff("d", DateTime.Today, v.Created)));
但是,这不起作用,因为DateDiff返回一个int?
,而Log10采用double?
或decimal?
我在SqlFunctions中找不到这样做的转换函数。我尝试将其乘以1.0,或将其强制转换,但出现以下错误:
System.Data.Entity.Core.EntityCommandExecutionException:错误
从存储提供程序的数据读取器读取时发生。见
详细信息的内部异常。-->System.Data.SqlClient.SqlException:
发生无效的浮点操作
如何使用SqlFunctions从int?
转换为double?
或decimal?
回答:
根据Ocelot20的响应,我切换了参数,并在创建的日期中添加了一天,这样它就不会产生负输入或0输入,这就是导致错误的原因。我还需要投双倍的票。这是工作版本的外观:
var date = DateTime.Today.AddDays(1);
this.Queryable = this.Queryable
.OrderByDescending(v => (double)v.UpVote - SqlFunctions.Log10(Math.Abs((double)
SqlFunctions.DateDiff("d", date, v.Created))));
在v.UpVote上增加一个演员阵容。LINQ转换器应插入适当的CONVERT指令。例外情况表明,问题与执行操作有关,而不是与转换所涉及的类型有关。在SQL中使用
LOG10
将在传递负数时引发此异常(请尝试:选择LOG10(-1)
)。如果SqlFunctions.DateDiff
返回一个负数(它可以返回负数,具体取决于创建的日期),则查询将失败
我猜你只需要切换DateTime.Today
和v.Created
就可以在合适的演员阵容中发挥作用,如下所示:
this.Queryable
.Select(v => v.UpVote +
SqlFunctions.Log10(
(double?)SqlFunctions.DateDiff("d", v.Created, DateTime.Today));
或者如果v.Created
碰巧包含了未来的日期,或者存在一些负时差,您可以使用Math.Abs
来确保它始终是正的,就像这样:
this.Queryable
.Select(v => v.UpVote +
SqlFunctions.Log10(
(double?)Math.Abs(
SqlFunctions.DateDiff("d", DateTime.Today, v.Created)));
编辑-除了使用负数失败外,LOG10
在提供0时也会失败。您可以过滤掉0,或将其作为修改器忽略:
from v in this.Queryable
let dayDiff = SqlFunctions.DateDiff("d", v.Created, DateTime.Today)
let voteWeight = dayDiff == 0 ?
0 :
SqlFunctions.Log10((double?)dayDiff)
select v.UpVote + voteWeight
我没有测试这个精确的查询,但它的jist是,小于或等于0的数字需要以某种方式进行处理。谢谢你的回答,但将其转换为双精度是我已经尝试过的事情之一(参见我的笔记)。数学也是如此。我试着改变它-同样的错误。查看我的更新。查询是有效的,因此这肯定是一个数据问题。在Linqpad中尝试这些,并使用生成的SQL更好地理解问题也是明智的。宾果-错误发生在今天创建的项上,Log10返回0。我给今天加了一天,结果成功了。非常感谢。我还需要投双倍的票。试图接受两个答案,但都不行。两者都提供了部分答案。