C# EF 4.1/Linq to SQL:什么更好:使用Equals或==?

C# EF 4.1/Linq to SQL:什么更好:使用Equals或==?,c#,.net,linq,entity-framework,linq-to-sql,C#,.net,Linq,Entity Framework,Linq To Sql,我们正在讨论在LINQ查询中的int比较中使用Equals或=。我们首先使用EF4.1代码。什么更好 var query = context.Boodschappen .Where(b => b.BoodschapID == id).FirstOrDefault(); 或: 为什么?我更喜欢前者。它也适用于可为空的属性。对于Linq To Sql,两者都不需要。相反,使用Object.Equals:。其中(b=>Object.Equals(b.Boo

我们正在讨论在LINQ查询中的int比较中使用
Equals
=
。我们首先使用EF4.1代码。什么更好

var query = context.Boodschappen
                   .Where(b => b.BoodschapID == id).FirstOrDefault();
或:


为什么?

我更喜欢前者。它也适用于可为空的属性。

对于Linq To Sql,两者都不需要。相反,使用Object.Equals:
。其中(b=>Object.Equals(b.BoodschapID,id)

为什么?因为SQL生成器中的一个错误,如果id恰好是一个可为空的唯一标识符。如果使用b.BoodschapID.Equals(id)或者b.BoodschapID==id和b.BoodschapID恰好是一个可为NULL的Guid,生成的SQL将不是
其中BoodschapID为NULL
,而是
其中BoodschapID=@p0
不会返回任何结果

我确信EF以前也有同样的错误。不知道它是否已经解决。你可以找到更多细节,只是要知道一些答案会产生可怕的SQL


除此之外,据我所知,Linq To SQL中的Equals和==之间没有区别。

这个错误似乎只存在于EF中。我一直这样使用Linq2SQL,没有任何问题。@leppie当我在.net 4.0上遇到与Linq To SQL完全相同的问题时,我偶然发现了它:(参见链接的问题。很有意思。从来没有这个问题。哪一方是可空的?顺便说一句,不需要做
Object.Equals(…)
Equals(…)
也可以。@leppie两边都有。本质上:
public SomeObj Get(Guid?someId){return(从db.GetTable()中的行开始,其中row.someId==someId选择row.AsBusiness()).FirstOrDefault();}
会触发它。
行.SomeID.Equals(id)
也有同样的问题。
其中Equals(行.SomeID,SomeID)
修复了它,但没有生成糟糕的SQL。该错误不会发生在
where row.SomeID==null
中。本质上,表达式分析器不识别SomeID为null,并将其视为正常参数。
var query = context.Boodschappen
                   .Where(b => b.BoodschapID.Equals(id)).FirstOrDefault();