使用变量但不是硬编码字符串时出现奇怪的LINQ错误

时间:2011-06-06 23:44:33

标签: linq-to-entities sql-server-ce

我在Entity Framework(v1)上运行一个简单的LINQ查询,并指向SQL Server Compact v3.5 SP2(8085):

var myResults = (from m in myContext.MyData
                 join o in myContext.SomeOtherData on new { m.ID, Name = myNameVariable } equals new { o.ID, o.Name }
                 select m).ToArray();

上述查询将失败,并显示以下错误:

  

指定的参数值   功能无效。 [参数#=   1,函数名称(如果已知)= isnull   ]

如果我通过简单地用硬编码字符串替换myNameVariable来更改查询,它就可以工作。例如:

var myResults = (from m in myContext.MyData
                 join o in myContext.SomeOtherData on new { m.ID, Name = "SomeNameValue"} equals new { o.ID, o.Name }
                 select m).ToArray();

这里发生了什么?我100%肯定myNameVariable设置为有效字符串。肯定是 null。

1 个答案:

答案 0 :(得分:1)

EF为这些查询生成不同的SQL。

对于硬编码字符串,它在SQL中使用字符串文字。

对于变量,它使用SQL参数来防止SQL注入(硬编码字符串没有风险,除非你自己做!)。

因此SQL CE必须以不同的方式对待这两者。