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

Ada*_*mBT 7 c# linq

我们有一个刚开始学习LinqToSql的新开发人员.在查看他的代码时,我们注意到他正在使用.Equals而不是==进行价值比较.最重要的是,他正在将a int与a 进行比较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)
Run Code Online (Sandbox Code Playgroud)
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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

结果:

3.Equals("3") returns False
int .Equals String Results:
Mike
Joe
Candy
int == int Results:
Mike
Joe
Candy
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

任何解释?

Not*_*ble 11

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


小智 5

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