您的位置:首页 > 其它

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

2017-03-07 11:01 253 查看

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 = 1, Name = "小白", Age = 15},
new PerInfo{Id = 2, Name = "小日", Age = 17},
new PerInfo{Id = 3, Name = "小月", Age = 18},
new PerInfo{Id = 4, Name = "小明", Age = 22}
};

List<CustInfo> custInfos = new List<CustInfo>
{
new CustInfo{PerId = 1, Tel = "153******", Email = "123@qq.com"},
new CustInfo{PerId = 1, Tel = "153****11", Email = "321@qq.com"},
new CustInfo{PerId = 2, Tel = "134******", Email = "112@qq.com"},
new CustInfo{PerId = 2, Tel = "134****11", Email = "211@qq.com"},
new CustInfo{PerId = 4, Tel = "125******", Email = "134@qq.com"},
new CustInfo{PerId = 4, 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 > 1
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


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: