我有以下表格:
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转换为字符串进行原始尝试。
答案 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包含LTRIM
并RTRIM
包围CAST
,否则将找不到匹配项
通过在C#Linq中添加SqlFunctions.StringConvert((double)o.OperatorId).Trim()
,它会修剪生成的SQL中的空白区域并返回预期值。