Linq Coding -- Part Eight (Equals Topic)

首先说一下同等联接,大家一般都知道Join Clause执行的其实是同等联接。
那是什么是同等联接呢?
    同等联接:就是只能在两个键(外键、内键)之间的相等关系Match。而其他类型的比较(比如,"greater than","less than"

或者"not equals")都是不支持。

嗯!/,为了表明所有联接即是同等联接,Join Clause Using equals key word is not "==" operator.

equals is only using join clause,并且它与 == 运算符之间存在一个重要区别


那重要区别到底指什么呢?
首先要知道Linq中的equals关键字,只是一个Code snippet,其实就是implementing Equals Method
以下是equals Code snippet:

复制代码
 1 public override bool Equals (object obj) {
 2         if (obj == null || GetType() != obj.GetType()) {
 3             return false;
 4         }
 5         // TODO: write your implementation of Equals() here
 6         throw new Exception();
 7         return base.Equals (obj);end 
 8     }
 9     
10     // override object.GetHashCode
11     public override int GetHashCode() {
12         // TODO: write your implementation of GetHashCode() here
13         throw new Exception();
14         return base.GetHashCode();
15     }]]>
16 
复制代码

好了,明白了这些,其实它们的区别,我可以用两句话说明
      1.Equals 方法只是在 System.Object 中定义的一个虚拟方法,它由任何选择执行该任务的类所重写;== 运算符是一个可由类

重载的运算符,该类通常具有恒等行为。
      2.二者之间的主要区别就是在于多态表现上,Equals方法是重写,而==运算符是被重载。这意味着除非编译器知道invoke更为具

体的版本,否则它只是调用恒等版本。


嗯,对于Linq中equals,比如看看这句:

on p.FirstName equals pp.Owner.FirstName

   p.FirstName为外部源序列,而pp.Owner.FirstName则是内部源序列;所以简单的理解,左键就是表示外部源序列,反之右键就是表示内部源序列;反正了解就是。那更多的 equals & == 的Code,可以参见 GroupJoin 中的2,3两段代码 queryForLinq,queryForLinq2

 

Wow,接下来我们继续聊聊Equals相关方法,看看这几个Equals方法
1.SequenceEqual()
2.GreaterThanOrEqual()
3.LessThanOrEqual()
4.NotEqual()

 

SequenceEqual(): 根据相等比较器确定两个序列是否相等。
它有两个重载方法,1.通过使用相应类型的默认相等比较器对序列的元素进行比较,以确定两个序列是否相等。
                             2.使用指定的 IEqualityComparer<(Of <(T>)>) 对两个序列的元素进行比较,以确定序列是否相等。

 

*以下是两个重载方法应用的DEMO

复制代码

 1 public class Equal {
 2         public void SequenceEqual() {
 3             Product p = new Product { CategoryID = 1, Name = "111" };
 4             Product pp = new Product { CategoryID = 2, Name = "222" };
 5             Product ppp = new Product { CategoryID = 2, Name = "222" };
 6             
 7             ///比较的数据源
 8             List<Product> ps = new List<Product> { p, pp };
 9             List<Product> pps = new List<Product> { p, pp, ppp };
10             
11             ///第一种重载
12             Boolean equal = ps.SequenceEqual(pps);
13 
14             Console.WriteLine(equal ? "are" : "are not");
15 
18             ///第二种重载:实现IEqualityComparer接口
19             IEnumerable<Product> str = ps;
20             IEnumerable<Product> str1 = pps;
23 
24             ObjectCompare objectCompare = new ObjectCompare();
27 
28             Boolean equality = ps.SequenceEqual(pps, objectCompare);
29 
30             Console.WriteLine(equal ? "are" : "are not");
31             
32             ///第一种重载,只是换了一种数据源
33             IEnumerable<Int32> values = Enumerable.Range(010); 
34             IEnumerable<Int32> sequence = Enumerable.Range(05)

                                                    .Concat(Enumerable.Range(55)); 
35             
36             Boolean sequenceEqual = values.SequenceEqual(sequence);
37             Console.WriteLine(sequenceEqual);
38         }
39 
40         /// <summary>
41         /// 第二种重载:实现IEqualityComparer接口
42         /// </summary>
43         public class ObjectCompare : IEqualityComparer<Product> {
44             #region IEqualityComparer<Product> Members
45 
46             public bool Equals(Product x, Product y) {
47                 return x == y;
48             }
49 
50             public int GetHashCode(Product obj) {
51                 string s = String.Format("{0}{1}", obj.Name, 

                                                      obj.CategoryID.ToString());
52                 return s.GetHashCode();
53             }
55             #endregion
56         }
57     }

复制代码

GreaterThanOrEqual():创建一个表示“大于或等于”数值比较的 BinaryExpression。可指定实现方法。

 

Demo:

BinaryExpression greaterThanOrEqual = 
    Expression.GreaterThanOrEqual(Expression.Constant(
3.0), 

                                    Expression.Constant(9.0));

Console.WriteLine(greaterThanOrEqual.ToString());

 

LessThanOrEqual:创建一个表示“小于或等于”数值比较的 BinaryExpression。

 

Demo:

复制代码

BinaryExpression lessThanOrEqual = 
      Expression.LessThanOrEqual(Expression.Constant(
7.0), 

                                   Expression.Constant(7.0));


Console.WriteLine(lessThanOrEqual.ToString());

复制代码

 

NotEqual:创建一个表示不相等比较的 BinaryExpression。

 

Demo:

BinaryExpression notEqual = 
      Expression.NotEqual(Expression.Constant(
41.0), Expression.Constant(42.0));


Console.WriteLine(notEqual.ToString());

 

 

LINQ Coding 目录

  1. Linq Coding -- Part One
  2. Linq Coding -- Part Two[标准查询运算符]
  3. Linq Coding -- Part Three [Let子句]
  4. Linq Coding -- Part Four[Concat应用]
  5. Linq Coding -- Part Five (Join之内部联接查询)
  6. Linq Coding -- Part Six (Join之分组联接)
  7. Linq Coding -- Part Seven (Join之左外部联接、DefaultIfEmpty、GroupJoin)
  8. Linq Coding -- Part Eight (Equals Topic)
posted @   RicoRui  阅读(2725)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2007-08-20 VS 2005 Web Application Project 项目中Profile的使用方法[程序文档]
2007-08-20 WCF读书笔记
点击右上角即可分享
微信分享提示