联接用于通过公共键合并保存数据的不同列表或表。
像在SQL中一样,LINQ支持以下类型的联接:
内联接,左联接,右联接,交叉联接和完全外联接。
以下示例中使用了以下两个列表:
var first = new List<string>(){ "a","b","c"}; // 剩余数据 var second = new List<string>(){ "a", "c", "d"}; // 正确的数据
var result = from f in first join s in second on f equals s select new { f, s }; var result = first.Join(second, f => f, s => s, (f, s) => new { f, s }); // Result: {"a","a"} // {"c","c"}
var leftOuterJoin = from f in first join s in second on f equals s into temp from t in temp.DefaultIfEmpty() select new { First = f, Second = t}; // 或者也可以: var leftOuterJoin = from f in first from s in second.Where(x => x == f).DefaultIfEmpty() select new { First = f, Second = s}; // Result: {"a","a"} // {"b", null} // {"c","c"} // 左外部联接方法语法 var leftOuterJoinFluentSyntax = first.GroupJoin(second, f => f, s => s, (f, s) => new { First = f, Second = s }) .SelectMany(temp => temp.Second.DefaultIfEmpty(), (f, s) => new { First = f.First, Second = s });
var rightOuterJoin = from s in second join f in first on s equals f into temp from t in temp.DefaultIfEmpty() select new {First=t,Second=s}; // Result: {"a","a"} // {"c","c"} // {null,"d"}
var CrossJoin = from f in first from s in second select new { f, s }; // Result: {"a","a"} // {"a","c"} // {"a","d"} // {"b","a"} // {"b","c"} // {"b","d"} // {"c","a"} // {"c","c"} // {"c","d"}
var fullOuterjoin = leftOuterJoin.Union(rightOuterJoin); // Result: {"a","a"} // {"b", null} // {"c","c"} // {null,"d"}
上面的示例具有简单的数据结构,因此您可以专注于从技术上理解不同的LINQ联接,但是在现实世界中,您将拥有带有需要联接的列的表。
在下面的示例中,仅使用一个类Region,实际上,您将联接两个或多个具有相同键的表(在此示例中first,second并通过common key联接ID)。
示例:考虑以下数据结构:
public class Region { public Int32 ID; public string RegionDescription; public Region(Int32 pRegionID, string pRegionDescription=null) { ID = pRegionID; RegionDescription = pRegionDescription; } }
现在准备数据(即填充数据):
// 剩余数据 var first = new List<Region>() { new Region(1), new Region(3), new Region(4) }; // 正确的数据 var second = new List<Region>() { new Region(1, "Eastern"), new Region(2, "Western"), new Region(3, "Northern"), new Region(4, "Southern") };
您可以看到在此示例first中不包含任何区域描述,因此您想从中加入它们second。然后内部联接看起来像:
// 做内部联接 var result = from f in first join s in second onf.IDequals s.ID select new { f.ID,s.RegionDescription}; // Result: {1,"Eastern"} // {3,北部} // {4,"Southern"}
此结果可以即时创建匿名对象,但这很好,但是我们已经创建了一个适当的类-因此我们可以指定它:代替 我们可以说的,它会返回相同的数据但会创建类型的对象-保持与其他对象的兼容性。select new { f.ID,s.RegionDescription};select new Region(f.ID, s.RegionDescription);Region
.NET小提琴上的实时演示
在欢迎你拥抱OpenFOAM之前,首先欢迎来到C++的世界! 若有程序员说 xxx语言是世界上最好的语言 不严重的情况是整个聊天群下午就会爆掉了,严重的是会引起人身攻击的。虽然PHP直接在官方文档里面说 PHP is the best language for web programming 但C++并没有说C++ is the best language for scientific compu
本文向大家介绍c#语言Parallel.For,包括了c#语言Parallel.For的使用技巧和注意事项,需要的朋友参考一下 示例 一个使用Parallel.For循环对网站网址的给定数组执行ping操作的示例。
本文向大家介绍C语言errno,包括了C语言errno的使用技巧和注意事项,需要的朋友参考一下 示例 当标准库函数失败时,通常会将errno设置为适当的错误代码。C标准要求至少设置3个errno值: 值 含义 益登 域错误 范围 范围误差 序列号 非法的多字节字符序列
本文向大家介绍C#语言for,包括了C#语言for的使用技巧和注意事项,需要的朋友参考一下 示例 语法: for (initializer; condition; iterator) 在for当已知迭代次数回路常用。 在initializer进入循环之前,本节中的语句仅运行一次。 本condition节包含一个布尔表达式,该布尔表达式在每次循环迭代结束时进行评估,以确定循环是应该退出还是应该再次运
C/C++ 语言参考 基本C/C++ 预处理命令 操作符优先级 转义字符 ASCII码表 基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ C++
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。