LINQ to SQL为标量值运行直接SQL

时间:2011-05-11 07:21:16

标签: c# sql-server sql-server-2008 linq-to-sql

我正在尝试执行以下原始SQL,因为LINQ没有对DateDiff的适当支持:

var str = @"SELECT ISNULL(AVG(DATEDIFF(DAY, AddedDate, PresentDate)), 0)
              AS Days
                FROM DummyTable";

使用LINQ to SQL,我试图使用以下方法获取上述语句的输出:

var numberOfDays = Math.Round(db.ExecuteQuery<double>(str).FirstOrDefault());

这给了我错误:Specified cast is not valid.

我做错了什么?

提前致谢!

3 个答案:

答案 0 :(得分:3)

您的代码必须更改为:

var numberOfDays = db.ExecuteQuery<int>(str).FirstOrDefault());

你想为什么?我告诉你:

返回int中的DateDiff类型。返回AVG的类型将为int。所以IsNULL的返回类型也是int。

参考文献:
DateDiff AVG

IsNull总是尝试将第二个表达式的类型转换为第一个表达式。

答案 1 :(得分:0)

好的,我的坏。

看起来演员确实是错误的......将线路改为:

var numberOfDays = db.ExecuteQuery<int>(str).FirstOrDefault();

一切都很好!

答案 2 :(得分:0)

DATEDIFF()会返回int。传递整数集合时,AVG()函数也会返回一个整数。请尝试使用此代码:

    var numberOfDays = db.ExecuteQuery<int>(str).FirstOrDefault();