我们有一位刚开始学习LinqToSql的新开发人员。在查看代码时,我们注意到他使用.Equals
代替==
进行值比较。最重要的是,他正在比较int
和string
。令我们感到困惑的是,它有效!
经过一些测试后,似乎只能使用LinqToSql。 Linq to objects返回false
,只是int.Equals(“string”)
返回false
。
下面是一个使用两个sql表的简单测试:
Customer
Id(PK)(int)
Name(varchar)
CompanyId(FK)(int)
Company
Id(PK)(int)
Name(varchar)
Console.WriteLine("{0}.Equals(\"{1}\") returns {2}", 3, "3", 3.Equals("3"));
using (WrDataClassesDataContext wrDataContext = new WrDataClassesDataContext())
{
var customers1 = from c in wrDataContext.Customers
where c.CompanyId.Equals("3")
select c;
Console.WriteLine("int .Equals String Results: ");
foreach (Customer customer in customers1)
{
Console.WriteLine(customer.Name);
}
var customers3 = from c in wrDataContext.Customers
where c.CompanyId == 3
select c;
Console.WriteLine("int == int Results: ");
foreach (Customer customer in customers3)
{
Console.WriteLine(customer.Name);
}
}
结果:
3.Equals("3") returns False
int .Equals String Results:
Mike
Joe
Candy
int == int Results:
Mike
Joe
Candy
Press any key to continue . . .
有任何解释吗?
答案 0 :(得分:11)
LINQ to SQL从LINQ查询生成SQL代码。在SQL中,int
与string
的比较完全有效。会发生什么情况,通过使用.Equals
,您可以绕过==
运算符在编译时执行的类型检查。
答案 1 :(得分:5)
您的比较转换为SQL,SQL的行为与C#和.NET Framework不同。它类似于C#中"a" == "A"
的错误,但当它是查询的一部分时可能是真的。