以前一般都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只须要用一个JOIN就能够了,很是方便。近日遇到一种状况,两个表中的数据已经取到代码中,须要在代码中将这两个表关联起来,并获得它们横向拼在一块儿以后的完整数据。数据库
如:表1--商品信息表(dtHead),存放商品的ID和名称,表结构和数据以下:性能
表2--商品数量及金额表(dtTail),存放商品的数量、金额,表结构和数据以下:测试
如今要获得表1和表2横向拼接起来的表(DtAll),结果以下:this
在C#代码中,要将这两个表拼接起来,有不少笨办法,例如循环获取数据一条条拼起来,但在数据量大的状况下会影响性能,在字段多的时候也须要写一大堆给每一个字段依次赋值的代码。spa
使用LINQ能够帮助解决这一问题。下面提供了两种方案:blog
方案一:当可以肯定DtAll表的字段,而且字段不是不少的状况下,能够显式写出:事件
var query1 = from rHead in dtHead.AsEnumerable() from rTail in dtTail.AsEnumerable() where rHead.Field<Int32>("GoodID") == rTail.Field<Int32>("GoodID") select new { GoodID = rHead.Field<Int32>("GoodID"), GoodName = rHead.Field<String>("GoodName"), Num = rTail.Field<Int32>("Num"), Money = rTail.Field<Int32>("Money") }; DataTable dtNew = DtAll.Copy(); foreach (var obj in query1) { dtNew.Rows.Add(obj.GoodID, obj.GoodName, obj.Num, obj.Money); }
其中DtAll的表结构已经事先建立好了,在下面会给出全部代码。ip
方案二:LINQ提供了与SQL中相似的JOIN方法。而且当字段不少的状况下,每个字段都在select new中写出来比较麻烦,可使用以下的方式:it
var query = from rHead in dtHead.AsEnumerable() join rTail in dtTail.AsEnumerable() on rHead.Field<Int32>("GoodID") equals rTail.Field<Int32>("GoodID") select rHead.ItemArray.Concat(rTail.ItemArray.Skip(1)); foreach (var obj in query) { DataRow dr = DtAll.NewRow(); dr.ItemArray = obj.ToArray(); DtAll.Rows.Add(dr); }
使用Concat将表1和表2的字段拼接起来,做为总表DtAll的字段,但因为表一、表2中都存在字段GoodID,不能在表中出现重复的字段,所以使用Skip(1)跳过表2中的第一个字段GoodID。io
下面给出这个小例子完整的代码(不包括窗体,窗体上很简单,只有一个按钮)
首先写入测试数据:把表一、表2建立起来并插入如上图所示的数据(实际状况是表一、表2经过其余渠道直接获取到代码中的)
而后在单击“链接”按钮时,获得表一、表2横向链接后的表:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { DataTable dtHead = new DataTable(); DataTable dtTail = new DataTable(); DataTable DtAll = new DataTable(); public MainWindow() { InitializeComponent(); this.AddData(); } /// <summary> /// 建立表结构,添加数据源 /// </summary> private void AddData() { dtHead.Columns.Add("GoodID", typeof(Int32)); dtHead.Columns.Add("GoodName", typeof(String)); dtTail.Columns.Add("GoodID", typeof(Int32)); dtTail.Columns.Add("Num", typeof(Int32)); dtTail.Columns.Add("Money", typeof(Int32)); DtAll.Columns.Add("GoodID", typeof(Int32)); DtAll.Columns.Add("GoodName", typeof(String)); DtAll.Columns.Add("Num", typeof(Int32)); DtAll.Columns.Add("Money", typeof(Int32)); this.AddRow(1, "青岛纯生", 10, 30); this.AddRow(2, "哈尔滨啤酒", 5, 20); } /// <summary> /// 添加数据 /// </summary> /// <param name="goodID"></param> /// <param name="goodName"></param> /// <param name="num1"></param> /// <param name="num2"></param> private void AddRow(Int32 goodID, String goodName, Int32 num1,Int32 num2) { DataRow drH = dtHead.NewRow(); drH["GoodID"] = goodID; drH["GoodName"] = goodName; dtHead.Rows.Add(drH); DataRow drT = dtTail.NewRow(); drT["GoodID"] = goodID; drT["Num"] = num1; drT["Money"] = num2; dtTail.Rows.Add(drT); } /// <summary> /// “链接”按钮单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Join_Click(object sender, RoutedEventArgs e) { //方案一 var query1 = from rHead in dtHead.AsEnumerable() from rTail in dtTail.AsEnumerable() where rHead.Field<Int32>("GoodID") == rTail.Field<Int32>("GoodID") select new { GoodID = rHead.Field<Int32>("GoodID"), GoodName = rHead.Field<String>("GoodName"), Num = rTail.Field<Int32>("Num"), Money = rTail.Field<Int32>("Money") }; DataTable dtNew = DtAll.Copy(); foreach (var obj in query1) { dtNew.Rows.Add(obj.GoodID, obj.GoodName, obj.Num, obj.Money); } //方案二 var query = from rHead in dtHead.AsEnumerable() join rTail in dtTail.AsEnumerable() on rHead.Field<Int32>("GoodID") equals rTail.Field<Int32>("GoodID") select rHead.ItemArray.Concat(rTail.ItemArray.Skip(1)); foreach (var obj in query) { DataRow dr = DtAll.NewRow(); dr.ItemArray = obj.ToArray(); DtAll.Rows.Add(dr); } } } }