繁体   English   中英

System.Linq Linq查询无法在VS2012中工作,但在VS2010中可以正常工作

[英]System.Linq Linq queries not working in VS2012 but works fine in VS2010

我有一个linq查询,该查询在VS2010和VS2012上可以正常运行,该系统中的代码最初是编写的,但是在提交到SVN并拉到新系统时,没有构建代码。 相同的代码在2个系统中均能正常工作,但在其他3个系统中均具有VS2012,.NET Framework 4.0(目标框架)的系统中均无法运行。

不确定代码有什么问题。 我了解所编写的代码存在错误,并且编写方式非常错误。

这是样例linq查询,该查询在VS2010中工作正常,但在VS2012中失败。

from d in db.VacancyCandidates
join c in db.Candidates on new 
    { CandidateId = d.CandidateId, CandidateType = d.CandidateType}
equals new { CandidateId = c.CandidateId, CandidateType = c.CanidateTypeId }          
........Rest query ......

从上面的查询中, d.CandidateTypeNullable<int>c.CanidateTypeId为int。

我看了看下面的帖子 ,如果我改变d.CandidateTyped.CandidateType.Value然后代码生成正确。

我的问题是为什么代码不是在我的机器上构建在VS2010中,而不是在VS2012中构建?

添加更多屏幕截图可能会对您有所帮助。 失误 参考文献

有关编译器的更多信息:

在此处输入图片说明

知道在所有系统上,该项目的目标框架仅是4.0。 以上信息使用CSC /?检索CSC /? 命令C:\\Windows\\Microsoft.NET\\Framework64\\V4.0.3.319\\

我无法说说为什么它可以在VS2010中使用(很可能是较旧的C#编译器)版本的原因。

如今,编译器将使用引用成员的TypeName来确定它需要生成哪种匿名类型。

它将尝试匹配具有完全相同签名的所有匿名类型。 因此, new { A = "1" }new { A = "2" }将具有相同的类型,但是new { A = "1" }new { A = 1 }将没有相同的类型。

它会生成的第一个匿名类型可能是CandidateIdCandidateType类型为intint? 分别。 对于第二种匿名类型,它将验证是否还有其他类型具有完全相同的签名。 此处不是这种情况,因为CandidateType在第二个初始化程序中为int类型。

如前所述,为了使签名匹配,您需要确保类型对齐。

from d in db.VacancyCandidates
join c in db.Candidates on new { CandidateId = d.CandidateId, CandidateType = d.CandidateType}
equals new { CandidateId = c.CandidateId, CandidateType = (int?)c.CanidateTypeId }

请注意,如果值为null ,则使用Nullable<>类型的值将失败。 因此,您建议使用d.CandidateType.Value解决方案可能很危险。 可能 ”很危险,因为取决于您是通过Linq-to-SQL还是EntityFramework直接查询数据库,还是在内存中工作,行为是不同的。

当作为内存中的lambda执行时,使用null Nullable<>.Value将引发InvalidOperationException ,但不会将其转换为SQL查询,因为QueryProvider很聪明,可以解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM