2014-04-28 33 views
3

我正在尝试使用Linq to Entities对一些文章进行排序。我正在使用System.Data.Objects.SqlClient.SqlFunctions。这是我想什么有:Linq-to-Entities SqlFunctions:如何从int转换为double?或小数?

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: An error occurred while reading from the store provider's data reader. See the inner exception for details. ---> System.Data.SqlClient.SqlException: An invalid floating point operation occurred.

如何从int?转换double?decimal?使用SqlFunctions来?

答:

基于Ocelot20的回应,我换周围的论点,每天添加到所创建的日子,所以它永远不会产生负或者0的输入,这是什么原因造成的错误。我还需要将UpVote加倍。这是工作版本的样子:

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

回答

1

例外情况是表明问题与执行操作有关,而不是涉及转换相关类型的问题。在SQL中使用LOG10会在传递负数时抛出此异常(尝试:SELECT LOG10(-1))。如果SqlFunctions.DateDiff返回一个负数(根据Created日期不同),您的查询将失败。

我猜你只需要切换DateTime.Todayv.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))); 

编辑 - 除了与失败是负面的当提供0时,电话号码LOG10将失败。你可以滤除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,需要以某种方式处理。

+0

谢谢你的回答,但是把它加倍是我已经尝试过的事情之一(参见我的笔记)。 Math.Abs​​也是如此。我试着切换它 - 同样的错误。 – gabnaim

+0

查看我的更新。查询工作,所以它肯定是一个数据问题。在Linqpad中试试这些也是明智的,并且可以使用生成的SQL来更好地理解问题。 – Ocelot20

+0

宾果 - 错误是今天创建的项目,其中Log10返回0.我添加了一天到今天,它的工作。谢谢! – gabnaim

1

在v.UpVote上添加一个演员,使其加倍。 LINQ转换器应该插入相应的CONVERT指令。

+0

我还需要将UpVote加倍。试图接受这两个答案,但它不会这样做。两者都提供了答案的一部分。 – gabnaim