Linq“等于”关键字

时间:2009-12-15 16:11:54

标签: asp.net linq

LINQ中的“equals”关键字是否会检查左右对象是否相同 记忆或检查他们的内容?

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

这取决于对象。如果它是值类型,通常比较vaules,它是引用类型,比较引用,除非重写Equals()方法。

来自MSDN

  

Equals的默认实现   支持引用相等   引用类型和按位相等   对于价值类型。参考平等   表示对象引用   比较指的是同一个对象。   按位相等意味着对象   被比较的具有相同的二进制   表示。

     

请注意,派生类型可能   将Equals方法重写为   实现价值平等。

答案 2 :(得分:0)

连接查询中的'equals'使用默认的相等比较器来使用键控查找来比较键。连接在Enumerable.Join中实现,键可以是值或引用。 使用Linq to Sql查询时,键通常是一个值,因为主键通常映射到值类型。但是,如下面的代码说明,equals比较可以是值,也可以是引用,它们适用于键类型:

KeyObj k1 = new KeyObj(); k1.Id = 1001;
        KeyObj k2 = new KeyObj(); k2.Id = 1002;
        KeyObj k3 = new KeyObj(); k3.Id = 1003;
        KeyObj k4 = new KeyObj(); k4.Id = 1004;
        KeyObj k5 = new KeyObj(); k4.Id = 1005;

        List<Foo> foos = 
            new List<Foo>()
            {
                new Foo("o1",k1),
                new Foo("o2",k2),
                new Foo("o4",k5)
            };

        List<Bar> bars =
            new List<Bar>()
            {
                new Bar("o2",k1),
                new Bar("o3",k2),
                new Bar("o4",k4),
                new Bar("o5",k5)
            };


        var foobar = from f in foos
                     join b in bars on f.Ko equals b.Ko
                     select f.Name + " in foos joined by reference with " + b.Name + " in bars ";

        foreach (var v in foobar)
        {
            Debug.WriteLine(v);
        }

        foobar = from f in foos
                 join b in bars on f.Name equals b.Name
                 select f.Name + " in foos joined by value with " + b.Name + " in bars ";

        foreach (var v in foobar)
        {
            Debug.WriteLine(v);
        }

class KeyObj { public int Id { get; set; } }

class Foo : Base
{
    public Foo(string s, KeyObj ko) : base(s, ko) { }
}

class Bar : Base
{
    public Bar(string s, KeyObj ko) : base(s, ko) { }
}

class Base
{
    string _name = "";
    public string Name { get { return _name; }}

    KeyObj _ko = null;
    public KeyObj Ko { get { return _ko; }}

    public Base(string s, KeyObj ko)
    {
        _name = s;
        _ko = ko;
    }
}

这个输出是:

o1 in foos通过引用与条形图中的o2连接

o2 in foos通过引用加入o3 in bar

o4 in foos通过引用加入o5 in bar

o2 in foos in value by o2 in bar

o4 in foos in value by o4 in bar

答案 3 :(得分:0)

来自MSDN:http://msdn.microsoft.com/en-us/library/bb311040.aspx

等于运算符

join子句执行equijoin。换句话说,您只能基于两个键相等的匹配。不支持其他类型的比较,例如“大于”或“不等于”。要明确所有连接都是equijoins,join子句使用equals关键字而不是==运算符。 equals关键字只能在join子句中使用,并且它与一个重要方式的==运算符不同。使用equals时,左键消耗外部源序列,右键消耗内部源。外部源仅位于equals左侧的范围内,而内部源序列仅位于右侧的范围内。