C#中LINQ多条件JOIN时为什么可以使用匿名类

前言

本文主要介绍的是关于C#中LINQ多条件JOIN时为什么可以使用匿名类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

我们先来看一下linq中如何在join中指定多个条件

public ActionResult Edit(int id)
  {
   using (DataContext db = new DataContext(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString))
   {
    IQueryable<ClassInformation> result = from c in db.GetTable<TClass>()
              join t in db.GetTable<TTeacher>()
              on new { id = c.ID, id1 = c.ID }
              equals new { id = t.ClassID, id1 = id }
              select new ClassInformation { ID = c.ID, ClassID = t.ClassID, Name = c.Name, TeacherName = t.Name, Address = t.Address, Phone = t.Phone, Email = t.Email };
    ClassInformation k = result.Single();
    ViewData["K"] = k;
    return View();

   }

  }

C#中LINQ多条件JOIN时为什么可以使用匿名类

最近心血来潮突然想弄明白为什么LINQ中多条件JOIN的时候,使用new 匿名类就能成功,这是为什么呢?为什么LINQ用的equals 而不是常见的“==”?

随后,进行了如下的测试,发现equals对匿名类对象和具名类对象的处理不太一致

进一步了解才发现,

C#中,对匿名类的做了重写,使得最开始LINQ中的条件判断能够成功。不过,根据测试能发现,要让两个匿名对象相等,属性属性,属性名和属性值都必须一致才行。

进一步了解为什么equals对具名类对象的表现与匿名类对象的差异,发现equals只是object的虚方法,测试中自定义的类没有重写equals,再调用中调用了objects的方法而返回false。同时,也可以参考这个朋友的文章了解更多。

如下,是从SO上找到的关于“==”与equals的区别

所以,通常equals比较的两个对象的内容,“==”比较的是两者是否是同一个东西。在自定义的类中,如果要用到对象比较,可以根据需要重写equals来控制判断逻辑。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    我们知道目前大部分的数据库都是关系型数据库, 所谓关系型数据库,就是指建立在关系模型 基础之上的数据库系统,如Oracle.SQL Server.Access.MySQL等.关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织.一个偶然的机会我接触到了DB4O,它是一个完全面向对象的开源数据库,它的出现完全颠覆了传统的数据库在人们心中的形象,因为传统的数据库需要在数据体.实体之间转换,而且需要映射文件提供映射关系.正是这个项目让我产生了编写Xml4DB的想

  • c# linq的差集,并集,交集,去重代码(分享)

    如下所示: using System.Linq; List<string> ListA = new List<string>(); List<string> ListB = new List<string>(); List<string> ListResult = new List<string>(); ListResult = ListA.Distinct().ToList();//去重 ListResult = ListA.Exc

  • C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法

    在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的所有成员,也就意味着可以替不同的类型,创建更通用的方法.这个例子是这样做的:利用反射,读取一个类型的所有属性,然后再把属性转换成XML元素的属性或者子元素.下面注释比较完整,就话不多说了,有需要看代码吧! using System; using System.Collections.Generic;

  • c#中LINQ的基本用法实例

    一.什么是LINQ LINQ(读音link)代表语言集成查询(Language Integrated Query),是.NEt框架的扩展,它允许我们用SQL查询数据库的方式来查询数据的集合,使用它,你可以从数据库.程序对象的集合以及XML文档中查询数据 下面一个简单的示例,可以查询数组中小于8的数字并输出. 一般步骤:获取数据源.创建查询.执行查询.需要注意的是,尽管查询在语句中定义,但直到最后的foreach语句请求其结果的时候才会执行 using System; using System.C

  • C#中LINQ多条件JOIN时为什么可以使用匿名类

    前言 本文主要介绍的是关于C#中LINQ多条件JOIN时为什么可以使用匿名类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 我们先来看一下linq中如何在join中指定多个条件 public ActionResult Edit(int id) { using (DataContext db = new DataContext(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionS

  • c#中LINQ的基本用法(二)

    目录 1.筛选 2.用索引筛选 3.类型筛选 4.复合的from子句 5.排序 6.分组 7.对嵌套的对象分组 8.内连接 9.左连接 10.组连接 11.集合操作 12.合并 13.分区 14.聚合操作符 15.转换操作符 16.生成操作符 本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类.下面的例子需要用到LINQ基础(一)(https://www.jb51.net/article/244208.htm)的一些代码

  • C#中Linq的入门教程

    一.LINQ的体系结构 语言集成查询 (LINQ) (C#) | Microsoft 官方文档 LINQ总共包括五个部分: 程序集 命名空间 描述 LINQ to Objects System.Core.dll System.Linq 提供对内存中集合操作的支持 LINQ to XML System.Xml.Linq.dll System.Xml.Linq 提供对XML数据源的操作的支持 LINQ to SQL System.Data.Linq.dll System.Data.Linq 提供对S

  • SQL语句中不同的连接JOIN及join的用法

    为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来.通常有以下几种连接方式: JOIN  or  INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何一边缺失数据就不显示. LEFT JOIN(左外连接):即使右边的表中没有匹配,也从左表返回所有的行. RIGHT JOIN(右外连接):即使左边的表中没有匹配,也从右表返回所有的行. FULL JOIN(全外连接):只要其中一个表中存在匹配就返回行. 如例,有grade表(课程号sn,分数scro

  • C#中LINQ to DataSet操作及DataTable与LINQ相互转换

    一.DataTable的扩展方法: 1.DataTable转Linq:AsEnumerable 方法 返回的EnumerableRowCollection<DataRow> 实现了 IEnumerable<T>接口.其中泛型参数T是DataRow. 此对象可用在 LINQ表达式或方法查询中. 语法: public static EnumerableRowCollection<DataRow> AsEnumerable (this DataTable source); 在

  • C#中Linq延迟查询的例子

    提出问题 下面所给代码编译时正常,但是执行时会出错,请指出程序在执行时能够执行到编号为(1)(2)(3)的代码行中的哪一行. using System; using System.Collections.Generic; using System.Linq; namespace DeferredExecutionExp { class Program { static void Main(string[] args) { List<Student> studentList = new List

  • 基于python list对象中嵌套元组使用sort时的排序方法

    在list中嵌套元组,在进行sort排序的时候,产生的是原数组的副本,排序过程中,先根据第一个字段进行从小到大排序,如果第一个字段相同的话,再根据第二个字段进行排序,依次类推,当涉及到字母的时候,是按照字典序进行排序. 如下: a = [(1, 'B'), (1, 'A'), (1, 'C'), (1, 'AC'), (2, 'B'), (2, 'A'), (1, 'ABC')] a a.sort() a 输出结果为: [(1, 'B'), (1, 'A'), (1, 'C'), (1, 'AC

  • 对python中的控制条件、循环和跳出详解

    对python中的控制条件.循环和跳出详解 代码缩进(代码块): python用缩进表示代码块,没有其他语言的大括号 缩进是强制检查,整个代码缩进必须一致,否则无法运行 用2.4个空格或者tab缩进 ide自动保证缩进一致 If.elif和else的条件分支: if if...else if...elif..else 没有switch.case语法 空的列表.元祖.字符串.0都被评估为False None被评估为False 控制条件后面必须加":" a=100 if a > 80

  • Spring Boot中的那些条件判断的实现方法

    Spring Boot中的那些Conditional spring boot中为我们提供了丰富的Conditional来让我们得以非常方便的在项目中向容器中添加Bean.本文主要是对各个注解进行解释并辅以代码说明其用途. 所有ConditionalOnXXX的注解都可以放置在class或是method上,如果方式在class上,则会决定该class中所有的@Bean注解方法是否执行. @Conditional 下面其他的Conditional注解均是语法糖,可以通过下面的方法自定义Conditi

  • 解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题

    问题描述:在使用laravel的左联接查询的时候遇到一个问题,查询中带了右表一个筛选条件,导致结果没有返回右表为空的记录. 先附上代码: DB::table('users as u') ->select('u.user_id','c.class') ->leftJoin('class as c','c.user_id','=','u.user_id') ->where('c.status','=',2) ->get(); 解决方案: 1.在mysql的角度上说,直接加where条件

随机推荐