Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到实体SqlFunctions:如何从int转换为double?还是十进制?_C#_.net_Entity Framework_Linq To Entities_Sql Function - Fatal编程技术网

C# Linq到实体SqlFunctions:如何从int转换为double?还是十进制?

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))); 但是

我正在尝试使用LINQtoEntities对一些文章进行排序。我正在使用System.Data.Objects.SqlClient.SqlFunctions。这就是我想要的:

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。我给今天加了一天,结果成功了。非常感谢。我还需要投双倍的票。试图接受两个答案,但都不行。两者都提供了部分答案。