我在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。
答案 0 :(得分:1)
EF为这些查询生成不同的SQL。
对于硬编码字符串,它在SQL中使用字符串文字。
对于变量,它使用SQL参数来防止SQL注入(硬编码字符串没有风险,除非你自己做!)。
因此SQL CE必须以不同的方式对待这两者。