zoukankan      html  css  js  c++  java
  • 黄聪:Linq初级班 Linq to DataSet体验(单表、多表联合查询JOIN语法)

    Linq初级班 Linq To DataSet体验

    DataSet是包含内部数据表的对象,在这些内部数据表中,数据是临时存储并且可以被应用程序所使用.从本质上讲,DataSet是数据在本地内容中的缓存,且数据一般是从数据库中得到,这个缓存让我们可以在连接断开的模式下对DataSet中的数据进行更新,跟踪这些变化,并在应用程序重新连接时间这些变更保存到数据库中.

    DataSet本身非常灵活且强大.它为应用程序提供了有效地使用数据库中的数据子集以及根据应用程序需要操作数据的能力,而且所有这些都可以在断开连接的状态下进行,然后再将变更回馈数据库.虽然DataSet具有这么多的灵活性,但是在查询的方法上却很欠缺.而LINQ to DataSet为开发人员提供了一整套查询能力,本文将讲解如何使用它进行DataSet查询,目录如下:

    目录

    1.单表查询

    2.多表查询

    1.单表查询

    为了大家拿到代码好测试,我就不从数据库来获取数据了,直接用代码加载测试数据了.下面的示例演示用LINQ to DataSet筛选出所有的RoleId等于2的User:

    方法语法:

    代码
    //-----------------------------------------------------------
    // All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
    //-----------------------------------------------------------

    using System;
    using System.Linq;
    using System.Data;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    DataTable dtRole
    = new DataTable("Role");
    DataTable dtUser
    = new DataTable("User");
    DataSet ds
    = new DataSet("Test");

    //添加表格
    ds.Tables.AddRange(new DataTable[] { dtRole, dtUser });

    //添加角色
    dtRole.Columns.Add("Id", typeof(Int32));
    dtRole.Columns.Add(
    "Name", typeof(String));

    dtRole.Rows.Add(
    1, "管理员");
    dtRole.Rows.Add(
    2, "普通用户");
    dtRole.Rows.Add(
    3, "VIP用户");

    //添加用户
    dtUser.Columns.Add("Id", typeof(Int32));
    dtUser.Columns.Add(
    "Name", typeof(String));
    dtUser.Columns.Add(
    "RoleId", typeof(Int32));

    dtUser.Rows.Add(
    1, "黄聪", 1);
    dtUser.Rows.Add(
    2, "张三", 1);
    dtUser.Rows.Add(
    3, "李四", 2);
    dtUser.Rows.Add(
    4, "王五", 2);
    dtUser.Rows.Add(
    5, "赵六", 2);
    dtUser.Rows.Add(
    6, "孙七", 2);
    dtUser.Rows.Add(
    7, "周八", 3);
    dtUser.Rows.Add(
    8, "吴九", 3);

    //添加关系
    DataRelation dr = new DataRelation("R_User_Role", dtRole.Columns["Id"], dtUser.Columns["RoleId"]);
    ds.Relations.Add(dr);

    //查询出RoleId为2的所有用户
    var query = ds.Tables["User"].AsEnumerable().
    Where(u
    => u.Field<int>("RoleId") == 2)
    .Select(u
    => new
    {
    Id
    = u.Field<int>("Id"),
    Name
    = u.Field<string>("Name"),
    RoleId
    = u.Field<int>("RoleId")
    });

    foreach (var q in query)
    {
    Console.WriteLine(
    "Id:{0}\tName:{1}\tRoleId:{2}", q.Id, q.Name, q.RoleId);
    }
    }
    }
    }

    查询语法:

    var query = from u in ds.Tables["User"].AsEnumerable()
    where u.Field<int>("RoleId") == 2
    select
    new
    {
    Id
    = u.Field<int>("Id"),
    Name
    = u.Field<string>("Name"),
    RoleId
    = u.Field<int>("RoleId")
    };

    运行结果:

    2.多表查询

    下面的示例是通过User表中的RoleId字段联接到Role表,并且查询出所有的普通用户来:

    方法语法:

    代码
    //-----------------------------------------------------------
    // All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd .
    //-----------------------------------------------------------

    using System;
    using System.Linq;
    using System.Data;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    DataTable dtRole
    = new DataTable("Role");
    DataTable dtUser
    = new DataTable("User");
    DataSet ds
    = new DataSet("Test");

    //添加表格
    ds.Tables.AddRange(new DataTable[] { dtRole, dtUser });

    //添加角色
    dtRole.Columns.Add("Id", typeof(Int32));
    dtRole.Columns.Add(
    "Name", typeof(String));

    dtRole.Rows.Add(
    1, "管理员");
    dtRole.Rows.Add(
    2, "普通用户");
    dtRole.Rows.Add(
    3, "VIP用户");

    //添加用户
    dtUser.Columns.Add("Id", typeof(Int32));
    dtUser.Columns.Add(
    "Name", typeof(String));
    dtUser.Columns.Add(
    "RoleId", typeof(Int32));

    dtUser.Rows.Add(
    1, "黄聪", 1);
    dtUser.Rows.Add(
    2, "张三", 1);
    dtUser.Rows.Add(
    3, "李四", 2);
    dtUser.Rows.Add(
    4, "王五", 2);
    dtUser.Rows.Add(
    5, "赵六", 2);
    dtUser.Rows.Add(
    6, "孙七", 2);
    dtUser.Rows.Add(
    7, "周八", 3);
    dtUser.Rows.Add(
    8, "吴九", 3);

    //添加关系
    DataRelation dr = new DataRelation("R_User_Role", dtRole.Columns["Id"], dtUser.Columns["RoleId"]);
    ds.Relations.Add(dr);

    //查询出所有普通用户
    var query = ds.Tables["User"].AsEnumerable().Join(ds.Tables["Role"].AsEnumerable(), u => u.Field<int>("RoleId"), r => r.Field<int>("Id"), (u, r) => new
    {
    Id
    = u.Field<int>("Id"),
    Name
    = u.Field<string>("Name"),
    RoleId
    = r.Field<int>("Id"),
    RoleName
    = r.Field<string>("Name")
    }).Where(q
    => q.RoleId == 2);

    foreach (var q in query)
    {
    Console.WriteLine(
    "Id:{0}\tName:{1}\tRoleId:{2}\tRoleName:{3}", q.Id, q.Name, q.RoleId, q.RoleName);
    }
    }
    }
    }

    查询方法:

    var query = (from u in ds.Tables["User"].AsEnumerable()
    join r
    in ds.Tables["Role"].AsEnumerable()
    on u.Field
    <int>("RoleId") equals r.Field<int>("Id")
    select
    new
    {
    Id
    = u.Field<int>("Id"),
    Name
    = u.Field<string>("Name"),
    RoleId
    = r.Field<int>("Id"),
    RoleName
    = r.Field<string>("Name")
    }).Where(q
    => q.RoleId == 2);

    运行结果:

    小结:

    使用LINQ to DataSet可以轻松的在DataSet的表间做查询,使用Lambda表达式,开发人员能更直观的清晰的组织查询语句,从而实现对DataSet的轻松查询.目前我正在自学LINQ,在此把自己的学习成果分享一下,仅提供给初学者作为参考用,如果有错误的地方请高手指出,我尽快改正~~

  • 相关阅读:
    Python os模块介绍
    (转) JAVA中如何设置图片(图标)自适应Jlable等组件的大小
    (转)统计学习-2 感知机知识准备(模型类型、超平面与梯度下降法)
    详细讲述MySQL中的子查询操作 (来自脚本之家)
    (转)详解数据库的自然连接
    MySQL 数据类型 详解
    MySql详解(四)
    MySql详解(五)
    MySql详解(七)
    MySql详解(一)
  • 原文地址:https://www.cnblogs.com/huangcong/p/1923758.html
Copyright © 2011-2022 走看看