Linq to SQL .Equals在将int与string进行比较时返回true - > Id.Equals(“5”)返回true

时间:2012-02-17 13:56:36

标签: c# linq

我们有一位刚开始学习LinqToSql的新开发人员。在查看代码时,我们注意到他使用.Equals代替==进行值比较。最重要的是,他正在比较intstring。令我们感到困惑的是,它有效!

经过一些测试后,似乎只能使用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 . . .

有任何解释吗?

2 个答案:

答案 0 :(得分:11)

LINQ to SQL从LINQ查询生成SQL代码。在SQL中,intstring的比较完全有效。会发生什么情况,通过使用.Equals,您可以绕过==运算符在编译时执行的类型检查。

答案 1 :(得分:5)

您的比较转换为SQL,SQL的行为与C#和.NET Framework不同。它类似于C#中"a" == "A"的错误,但当它是查询的一部分时可能是真的。