网站首页 语言 会计 电脑 医学 资格证 职场 文艺体育 范文
当前位置:书香门第 > 计算机 > C语言

c#查询关键字之join 子句运用方法

栏目: C语言 / 发布于: / 人气:5.85K

引导语:c#是第一个面向组件的编程语言,其源码会编译成msil再运行。以下是小编整理的c#查询关键字之join 子句运用方法,欢迎参考阅读!

c#查询关键字之join 子句运用方法

使用 join 子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联。唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值。例如,食品经销商可能具有某种产品的供应商列表以及买主列表。例如,可以使用 join 子句创建该产品同一指定地区供应商和买主的列表。

join 子句接受两个源序列作为输入。每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性。join 子句使用特殊的 equals 关键字比较指定的键是否相等。join 子句执行的所有联接都是同等联接。join 子句的输出形式取决于所执行的联接的具体类型。以下是三种最常见的联接类型:

内部联接

下面的示例演示一个简单的内部同等联接。此查询产生一个“产品名称/类别”对平面序列。同一类别字符串将出现在多个元素中。如果 categories 中的某个元素不具有匹配的 products,则该类别不会出现在结果中。

C#

var innerJoinQuery =

from category in categories

join prod in products on equals goryID

select new { ProductName = , Category = }; //produces flat sequence

分组联接

含有 into 表达式的 join 子句称为分组联接。

C#

var innerGroupJoinQuery =

from category in categories

join prod in products on equals goryID into prodGroup

select new { CategoryName = , Products = prodGroup };

分组联接会产生一个分层的结果序列,该序列将左侧源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。分组联接没有等效的关系术语;它本质上是一个对象数组序列。

如果在右侧源序列中找不到与左侧源中的元素相匹配的元素,则 join 子句会为该项产生一个空数组。因此,分组联接基本上仍然是一种内部同等联接,区别只在于分组联接将结果序列组织为多个组。

如果您只选择分组联接的结果,则可以访问各个项,但无法识别结果所匹配的键。因此,通常更为有用的做法是选择分组联接的结果并放入一个也具有该键名的新类型中,如上一个示例所示。

当然,还可以将分组联接的'结果用作其他子查询的生成器:

C#

var innerGroupJoinQuery2 =

from category in categories

join prod in products on equals goryID into prodGroup

from prod2 in prodGroup

where Price > 2.50M

select prod2;

左外部联接

在左外部联接中,将返回左侧源序列中的所有元素,即使它们在右侧序列中没有匹配的元素也是如此。若要在 LINQ 中执行左外部联接,请将 DefaultIfEmpty 方法与分组联接结合起来,以指定要在某个左侧元素不具有匹配元素时产生的默认右侧元素。可以使用 null 作为任何引用类型的默认值,也可以指定用户定义的默认类型。下面的示例演示了用户定义的默认类型:

C#

var leftOuterJoinQuery =

from category in categories

join prod in products on equals goryID into prodGroup

from item in ultIfEmpty(new Product{Name = y, CategoryID = 0})

select new { CatName = , ProdName = };

equals 运算符

join 子句执行同等联接。换句话说,只能基于两个键之间的相等关系进行匹配。其他类型的比较(例如,“greater than”或“not equals”)不受支持。为了表明所有联接都是同等联接,join 子句使用 equals 关键字而不是 == 运算符。equals 关键字只能用在 join 子句中,并且它与 == 运算符之间存在一个重要区别。对于 equals,左键使用外部源序列,而右键使用内部源序列。外部源仅在 equals 的左侧位于范围内,而内部源序列仅在其右侧位于范围内。

非同等联接

通过使用多个 from 子句将新序列单独引入到查询中,可以执行非同等联接、交叉联接和其他自定义联接操作。

对象集合联接与关系表联接

在 LINQ 查询表达式中,联接操作是在对象集合上执行的。不能使用与两个关系表完全相同的方式“联接”对象集合。在 LINQ 中,仅当两个源序列没有通过任何关系相互联系时,才需要使用显式 join 子句。使用 LINQ to SQL 时,外键表在对象模型中表示为主表的属性。例如,在 Northwind 数据库中,Customer 表与 Orders 表之间具有外键关系。在将这两个表映射到对象模型时,Customer 类具有一个 Orders 属性,该属性包含与该 Customer 相关联的 Orders 的集合。实际上,已经为您执行了联接。

复合键

使用复合键可以测试多个值是否相等。还可以在 group 子句中使用组合键。