LINQ查询表达式---------join子句

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

内部联接

分组联接

左外部联接

class Program
{
public class PerInfo
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
} public class CustInfo
{
public int PerId
{
get;
set;
}
public string Tel
{
get;
set;
}
public string Email
{
get;
set;
}
} static void Main(string[] args)
{
List<PerInfo> perinfos = new List<PerInfo>
{
new PerInfo{Id = , Name = "小白", Age = },
new PerInfo{Id = , Name = "小日", Age = },
new PerInfo{Id = , Name = "小月", Age = },
new PerInfo{Id = , Name = "小明", Age = }
}; List<CustInfo> custInfos = new List<CustInfo>
{
new CustInfo{PerId = , Tel = "153******", Email = "123@qq.com"},
new CustInfo{PerId = , Tel = "153****11", Email = "321@qq.com"},
new CustInfo{PerId = , Tel = "134******", Email = "112@qq.com"},
new CustInfo{PerId = , Tel = "134****11", Email = "211@qq.com"},
new CustInfo{PerId = , Tel = "125******", Email = "134@qq.com"},
new CustInfo{PerId = , Tel = "125****11", Email = "431@qq.com"}
}; //1、内部联接
var query1 = from p in perinfos
join c in custInfos on p.Id equals c.PerId
select new { NewName = p.Name, NewTel = c.Tel, NewEmail = c.Email };
Console.WriteLine("内部联接:");
foreach (var item in query1)
{
Console.WriteLine(" {0} {1} {2}", item.NewName, item.NewTel, item.NewEmail);
} //2、分组联接_01
var query2 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select new { NewName = p.Name, NewQuery = groupquery };
Console.WriteLine("\n分组联接_01");
foreach (var v in query2)
{
Console.WriteLine("{0}", v.NewName);
foreach (var item in v.NewQuery)
{
Console.WriteLine(" {0} {1}", item.Tel, item.Email);
}
} //3、分组联接_02
var query3 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select groupquery;
Console.WriteLine("\n分组联接_02");
foreach (var v in query3)
{
foreach (var item in v)
{
Console.WriteLine(" {0} {1} {2}", item.PerId, item.Tel, item.Email);
}
} //4、分组联接_03
var query4 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select new
{
NewName = p.Name,
NewQuery = from q in groupquery
where q.PerId >
orderby q.Email descending
select q
};
Console.WriteLine("\n分组联接_03");
foreach (var v in query4)
{
Console.WriteLine("{0}", v.NewName);
foreach (var item in v.NewQuery)
{
Console.WriteLine(" {0} {1} {2}", item.PerId, item.Tel, item.Email);
}
} //5、左外联接_01
var query5 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select groupquery.DefaultIfEmpty(new CustInfo()
{
PerId = p.Id, Tel = "Nothing", Email = "Nothing"
});
Console.WriteLine("\n左外联接_01");
foreach (var v in query5)
{
foreach (var item in v)
{
Console.WriteLine(" {0} {1} {2}", item.PerId, item.Tel, item.Email);
}
} // 6、左外联接_02
var query6 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
from item in groupquery.DefaultIfEmpty()
select new { Email = item == null ? "Nothing!" : item.Email, ID = p.Id }; Console.WriteLine("\n左外联接_02");
foreach (var v in query6)
{ Console.WriteLine(" {0} {1} ", v.ID, v.Email); } Console.ReadLine();
}
}
输出结果:
内部联接:
小白 153****** 123@qq.com
小白 153****11 321@qq.com
小日 134****** 112@qq.com
小日 134****11 211@qq.com
小明 125****** 134@qq.com
小明 125****11 431@qq.com 分组联接_01
小白
153****** 123@qq.com
153****11 321@qq.com
小日
134****** 112@qq.com
134****11 211@qq.com
小月
小明
125****** 134@qq.com
125****11 431@qq.com 分组联接_02
1 153****** 123@qq.com
1 153****11 321@qq.com
2 134****** 112@qq.com
2 134****11 211@qq.com
4 125****** 134@qq.com
4 125****11 431@qq.com 分组联接_03
小白
小日
2 134****11 211@qq.com
2 134****** 112@qq.com
小月
小明
4 125****11 431@qq.com
4 125****** 134@qq.com 左外联接_01
1 153****** 123@qq.com
1 153****11 321@qq.com
2 134****** 112@qq.com
2 134****11 211@qq.com
3 Nothing Nothing
4 125****** 134@qq.com
4 125****11 431@qq.com 左外联接_02
1 123@qq.com
1 321@qq.com
2 112@qq.com
2 211@qq.com
3 Nothing!
4 134@qq.com
4 431@qq.com

  

LINQ查询表达式---------join子句的更多相关文章

  1. LINQ查询表达式---------select子句

    LINQ查询表达式---------select子句 1.1常见的select子句查询 class Program { public class PerInfo { public int Id { g ...

  2. LINQ查询表达式---------from子句

    LINQ查询表达式---------from子句 LINQ的查询由3基本部分组成:获取数据源,创建查询,执行查询. //1.获取数据源 List<, , , , , }; //创建查询 var ...

  3. LINQ查询表达式---------let子句

    LINQ查询表达式---------let子句 let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. class P ...

  4. LINQ查询表达式---------orderby子句

    LINQ查询表达式---------orderby子句 LINQ可以按元素的一个或多个属性对元素进行排序. class Program { public class PerInfo { public ...

  5. LINQ查询表达式---------group子句

    LINQ查询表达式---------group子句 LINQ表达式必须以from子句开头,以select或group子句结束.使用guoup子句来返回元素分组后的结果.group 子句返回一个 IGr ...

  6. LINQ查询表达式---------where子句

    LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...

  7. 2.3 LINQ查询表达式中 使用select子句 指定目标数据

    本篇讲解LINQ查询的三种形式: 查询对象 自定义查询对象某个属性 查询匿名类型结果 [1.查询结果返回集合元素] 在LINQ查询中,select子句和from子句都是必备子句.LINQ查询表达式必须 ...

  8. LINQ查询表达式---------into

    LINQ查询表达式---------into into 上下文关键字创建一个临时标识符,以便将 group.join 或 select 子句的结果存储到新的标识符 class Program { pu ...

  9. LINQ查询表达式(1) - 查询表达式基础

    LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...

随机推荐

  1. [Ramda] Convert a Promise.all Result to an Object with Ramda's zip and zipObj

    In this lesson, we'll use Promise.all to get an array that contains the resolved values from multipl ...

  2. 小强的HTML5移动开发之路(39)——jqMobi插件json格式ActionSheet

    在上一篇中我们学会了ActionSheet的使用,细心的朋友可能会发现其中创建列表的格式是HTML的,代码如下: function showCustomHtmlSheet() { $("#a ...

  3. nil和Nil和NULL的判断

    ,nil和Nil和NULL的判断 开 发过程中,我们通过http请求,后台返回json数据,而有时数据里某一字段的值为null-,然后我们把此值赋值给 NSArray,NSdictionary,或是N ...

  4. NSUserDefaults:通常用来保存一些小巧的数据,如用户的用户名密码,或者是用户的使用习惯,如是否自动打开背景音乐等。

    1,NSUserDefaults通常用来保存一些小巧的数据,如用户的用户名密码,或者是用户的使用习惯,如是否自动打开背景音乐等. 2,使用它的原因就是:代码简短,使用方便 3,使用方法如下: -(vo ...

  5. 初始化NSDictionary:(工作经验)两种方法有时候效果不一样

    方法1: NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; [dic setObject:[Hp_KeysArray obj ...

  6. ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLException: The connection property 'zeroDateTimeBehavior' acceptable values are: 'CO

    使用sqoop导入数据时报了如题的异常,异常的提示是 The connection property 'zeroDateTimeBehavior' acceptable values are: 'CO ...

  7. Linux 在主要的搜索命令和视图的信息

    查找命令和硬件信息查看的日常系统管理.最常见的维护操作. 继 Linux 基本查找命令做一个简单的比较.并列出了一些硬件信息经常使用的视图命令. man 经常使用选项 -k 知道功能.不知道名称 -f ...

  8. Android最新组件RecyclerView,替代ListView

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40379159 万众瞩目的android最新5.0版本号不久前已经正式公布了,对于我 ...

  9. Risk Adaptive Information Flow Based Access Control

    Systems and methods are provided to manage risk associated with access to information within a given ...

  10. C# await 高级用法

    原文:C# await 高级用法 本文告诉大家 await 的高级用法,包括底层原理. 昨天看到太子写了一段代码,我开始觉得他修改了编译器,要不然下面的代码怎么可以编译通过 await "林 ...