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

Linq to entities 使用变量而不是硬编码字符串时出现奇怪的LINQ错误,linq-to-entities,sql-server-ce,Linq To Entities,Sql Server Ce,我有一个简单的LINQ查询,运行在Entity Framework(v1)之上,指向SQL Server Compact v3.5 SP2(8085): 上述查询将失败,并出现以下错误: 指定的参数值 函数无效。[论点#= 1,函数名(如果已知)=isnull ] 如果我通过简单地用硬编码字符串替换myNameVariable来更改查询,它就会工作。例如: var myResults = (from m in myContext.MyData join o in

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

上述查询将失败,并出现以下错误:

指定的参数值 函数无效。[论点#= 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设置为有效字符串。它绝对不是空的。

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

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

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


所以SQL CE必须以不同的方式对待这两个问题。

您是否尝试用myNameVariable删除Name=myNameVariable?我不确定是否理解您的问题。如果我将“Name=myNameVariable”替换为“myNameVariable”,这将更改匿名类型的签名,并导致表达式失败。另外,如果我只需在ID上进行连接并使用where子句过滤名称,这一切都会起作用。如果我们不能让它工作,这是一个解决办法。更有趣的是,一些使用这种精确连接模式的查询工作正常,而另一些查询则失败。EF对表达式求值的方式似乎是一种侥幸。当我使用ToTraceString时,无论我使用变量还是字符串文字,输出都是相同的。你确定看到的是正确的吗?我见过我描述自己的行为。我肯定是在看正确的事情。这两个SQL字符串都是相同的,并且都是参数化的。据我所知,ToTraceString函数一定是在骗我,因为它为硬编码与基于变量的查询返回相同的字符串,但一个有效,另一个无效。所以我要给你荣誉。最后,我认为这是EF中的一个bug——至少在SQLCE之上。
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();