zoukankan      html  css  js  c++  java
  • DataSet中进行Join操作

    我们知道在T-SQL查询中可以很方便地将两个甚至是多个表的数据进行连接(join)操作,其结果就是新的结果集将包含多个表的列数据。

    如果是在客户端的DataSet中,也希望实现这样的效果,那么需要怎么做呢?

    protected override void OnLoad(EventArgs e)
    {
        DataSet ds = PrepareDataSet();
        gvCustomers.DataSource = ds.Tables[0];
        gvOrders.DataSource = ds.Tables[1];
    }

    /// <summary>
    /// 这个方法准备10个客户,每个客户有5个订单
    /// </summary>
    /// <returns></returns>
    private DataSet PrepareDataSet()
    {
        DataSet ds = new DataSet();
        DataTable tb1 = new DataTable("Customers");
        tb1.Columns.AddRange(new[]
            {
                new DataColumn("CustomerID")
                ,new DataColumn("CompanyName")
            });

        DataTable tb2 = new DataTable("Orders");
        tb2.Columns.AddRange(new[]
            {
                new DataColumn("CustomerID")
                ,new DataColumn("OrderID",typeof(int))
                ,new DataColumn("OrderDate",typeof(DateTime))
            });

        ds.Tables.AddRange(new[] { tb1, tb2 });
        //添加关系
        ds.Relations.Add("Customers_Orders_Relation", tb1.Columns["CustomerID"], tb2.Columns["CustomerID"]);

        for (int x = 0; x < 10; x++)
        {
            DataRow customer = tb1.NewRow();
            customer[0] = "CustomerID:" + x.ToString();
            customer[1] = "Company:" + x.ToString();
            tb1.Rows.Add(customer);
            for (int y = 0; y < 5; y++)
            {
                DataRow order = tb2.NewRow();
                order[0] = "CustomerID:" + x.ToString();
                order[1] = (y + 1) * 1000;
                order[2] = DateTime.Now;
                tb2.Rows.Add(order);
            }
        }

        return ds;

    }

    image

    首先第一种做法我们称为传统的做法

    微软知识库里面有个DataSetHelper ,可以对DataSet中的DataTable进行Distinct、Group by、Join和Create。请参考下面的链接http://www.cnblogs.com/mywebname/archive/2007/11/19/964764.html

    代码很多,这里就不重复粘贴了

    我们重点来看一下,如何实现两个表的Join,得到一个新的结果集呢

    private void btJoin_Click(object sender, EventArgs e)
    {
        Common.DataSetHelper helper = new Common.DataSetHelper(ref ds);

        DataTable tb = helper.SelectJoinInto("temp", ds.Tables["Orders"], "CustomerID,OrderID,OrderDate,Customers_Orders_Relation.CompanyName", null, "OrderID");

        gvJoinResult.DataSource = tb;
    }

    这里需要注意一下,第一个参数是新的表格名称,不能与现有表重复。第二个参数是要做为子表的DataTable,一般就是放在Leftjoin左边的那个表。

    第三个参数是字段列表,有意思的是,如果要引用其他表的字段,则需要用Customers_Orders_Relation.CompanyName这样的格式,即指定关系名称,再加上字段名称。

    第四个参数是要不要筛选。第五个字段是怎么排序

    关于这一个功能,微软已经在.NET 3.5中将其集成到了LINQ.官方称其为LINQ TO DataSet,下面我们大致来看一下

    1. 首先要添加有关的引用

    image

    2. 编写代码

    DataSet ds = PrepareDataSet();

    DataTable orders = ds.Tables["Orders"];
    DataTable customers = ds.Tables["Customers"];

    var query =
        from order in orders.AsEnumerable()
        join customer in customers.AsEnumerable()
        on order.Field<string>("CustomerID") equals
            customer.Field<string>("CustomerID")
        select new
        {
            CustomerID =
                order.Field<string>("CustomerID"),
            CompanyName =
                customer.Field<string>("CompanyName"),
            OrderDate =
                order.Field<DateTime>("OrderDate"),
            OrderID =
                order.Field<int>("OrderID")
        };

    gvJoinResult.DataSource =query.ToList();

    image

    具体在LINQ TO DataSet中进行连接查询的信息,请参考下面的链接

    http://msdn.microsoft.com/zh-cn/library/bb386969.aspx

  • 相关阅读:
    asp.net操作cookie
    前端实现浏览器端大文件分片上传
    百度WebUploader实现浏览器端大文件分片上传
    网页实现浏览器端大文件分片上传
    c#.net实现浏览器端大文件分片上传
    SpringCloud实现浏览器端大文件分片上传
    jsp实现浏览器端大文件分片上传
    Java实现浏览器端大文件分片上传解决方案
    Java实现浏览器端大文件分片上传功能
    Java实现浏览器端大文件分片上传方案
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1445994.html
Copyright © 2011-2022 走看看