SQL返回数据,但相应的Linq语句不返回任何数据

时间:2013-11-20 21:23:56

标签: c# sql sql-server linq

我有以下表格:

Operators
    OperatorId (int)
    Username (varchar)
    IsActive (bit)

EventLogs
    ...
    UserID (varchar)
    ...

以下SQL语句返回2行数据,因为这些是在EventLogs表中只包含数据的2个操作符:

select distinct o.OperatorId, o.Username, o.IsActive
from Operators o
join EventLogs e on CAST(o.OperatorId AS VARCHAR) = e.UserID
where e.UserID != 'NULL'

使用Linqer,它产生了以下Linq语句:

(from o in db.Operators
join e in db.EventLogs on SqlFunctions.StringConvert((Double)o.OperatorId) equals e.UserID
where
    e.UserID != "NULL"
select new {
    o.OperatorId,
    o.Username,
    o.IsActive
}).Distinct()

我很难理解并编写正确的Linq语句,以便返回相同的信息。

我尝试将e.UserID作为INT进行CAST,它在SQL中返回相同的2个结果,并使用Linqer工具在Linq中返回不同的结果:

SQL

select distinct o.OperatorId, o.Username, o.IsActive
from Operators o
join EventLogs e on o.OperatorId = CAST(e.UserID AS INT)
where e.UserID != 'NULL'

LINQ的

(from o in db.Operators
join e in db.EventLogs on new { OperatorId = o.OperatorId } equals new { OperatorId = (int?)(int)(Int32)e.UserID }
where
      e.UserID != "NULL"
select new {
      OperatorId = (int?)o.OperatorId,
      o.Username,
      o.IsActive
}).Distinct()

不同之处在于这个Linq甚至没有编译。

The type arguments cannot be inferred from the query.加入失败,而(Int32)广告投放失败并显示Cannot cast expression of type 'string' to type 'int'

我可以使用SqlFunctions.StringConvert将o.OperatorId转换为字符串进行原始尝试。

1 个答案:

答案 0 :(得分:0)

我很幸运能够运行SQL事件探查器,因为这是一个开发服务器。

SqlFunctions.StringConvert((double)o.OperatorId) 
C#中的

等同于

STR( CAST( OperatorId AS float))
在SQL中

SQL中生成的浮点值包含前导和尾随空格。

所以

WHERE (N'1' = (STR( CAST( [Extent1].[OperatorId] AS float)))) OR (N'2' = (STR( CAST( [Extent1].[OperatorId] AS float))))
除非SQL包含LTRIMRTRIM包围CAST

,否则

将找不到匹配项

通过在C#Linq中添加SqlFunctions.StringConvert((double)o.OperatorId).Trim(),它会修剪生成的SQL中的空白区域并返回预期值。