zoukankan      html  css  js  c++  java
  • 那天有个小孩跟我说LINQ(六)转载

    2  LINQ TO SQL完结(代码下载)

         我们还是接着上次那个简单的销售的业务数据库为例子,打开上次那个例子linq_Ch5

    2.1 当数据库中的表建立了主外键

    ①根据主键获取子表信息

       将Sales表中的UserID和Users表中的ID建立主外键关系,打开数据库,新建查询,执行下面的T-sql

    alter table Sales
    add constraint FK_UserID foreign key(UserId) REFERENCES Users(Id)
    go

       当然你也可以手动可视化模式创建

       当然你也可以在dbml文件中手动创建,一个User可以有很多Sales,所以User是父类

    imageimageimage

    如果你是采用Tsql模式,你可以先删掉dbml中的表,然后重新从服务器资源管理器中拖表到dbml文件中去重新生成

    如果采用DBML中完成外键等等,就不用重新从服务器资源管理器中拖表到dbml文件中去重新生成了

    开始写代码:

       1:       var query20 = from o in db.Users
       2:                            select new
       3:                            {
       4:                                ID = o.ID,
       5:                                UserName = o.UserName,
       6:                                Items = o.Sales
       7:                            };
       8:              foreach (var item in query20)
       9:              {
      10:                  Console.WriteLine("用户名为"+item.UserName+"订单信息如下:");
      11:                  foreach (var sal in item.Items)
      12:                  {
      13:                      Console.WriteLine("产品编号:" + sal.ProductCode +"  购买时间:" + sal.CreateDate.ToString("yyyy年MM月dd日"));
      14:                  }
      15:                 
      16:              }

    效果图:

                 image

    ②根据外键获得主表信息

        代码如下:

       1:  var query21 = from o in db.Sales
       2:                            select new
       3:                            {
       4:                                ID = o.ID,
       5:                                ProCode=o.ProductCode,
       6:                                ProName=db.Products.FirstOrDefault(c=>c.ProductCode==o.ProductCode).ProductName,
       7:                                ProQuantity=o.Quantity,
       8:                                CreateDate=o.CreateDate,
       9:                                UserName=o.Users.UserName 
      10:                            };
      11:              foreach (var item in query21)
      12:              {
      13:                      Console.WriteLine("产品编号:" + item.ProCode +"   "+ item.ProName+"*"+item.ProQuantity+"  购买人:"+item.UserName+"  购买时间:" + item.CreateDate.ToString("yyyy年MM月dd日"));
      14:              }

                 

    效果图:

    image

     

    2.2 使用DataContext.Log显示生成的 SQL

         就使用我们2.1中的第二个例子,在query上面加一行代码

              代码如下:

       1:          db.Log=Console.Out;
       2:              var query21 = from o in db.Sales
       3:                            select new
       4:                            {
       5:                                ID = o.ID,
       6:                                ProCode=o.ProductCode,
       7:                                ProName=db.Products.FirstOrDefault(c=>c.ProductCode==o.ProductCode).ProductName,
       8:                                ProQuantity=o.Quantity,
       9:                                CreateDate=o.CreateDate,
      10:                                UserName=o.Users.UserName 
      11:                            };
      12:   
      13:              foreach (var item in query21)
      14:              {
      15:                  Console.WriteLine("产品编号:" + item.ProCode + "   " + item.ProName + "*" + item.ProQuantity + "  购买人:" + item.UserName + "  购买时间:" + item.CreateDate.ToString("yyyy年MM月dd日"));
      16:              }

    效果图:

    image

    接下来,我们把这条SQL语句保存成文件

    使用using System.IO;

    代码如下:

       1:   string filePath = Environment.CurrentDirectory+@"linq5"+DateTime.Now.ToString("yyyyMMddHHmmddss")+".sql";
       2:              TextWriter log;
       3:              log = System.IO.File.CreateText(filePath);
       4:              db.Log = log;
       5:              var query22 = from o in db.Sales
       6:                            select new
       7:                            {
       8:                                ID = o.ID,
       9:                                ProCode = o.ProductCode,
      10:                                ProName = db.Products.FirstOrDefault(c => c.ProductCode == o.ProductCode).ProductName,
      11:                                ProQuantity = o.Quantity,
      12:                                CreateDate = o.CreateDate,
      13:                                UserName = o.Users.UserName
      14:                            };
      15:   
      16:              foreach (var item in query22)
      17:              {
      18:                  Console.WriteLine("产品编号:" + item.ProCode + "   " + item.ProName + "*" + item.ProQuantity + "  购买人:" + item.UserName + "  购买时间:" + item.CreateDate.ToString("yyyy年MM月dd日"));
      19:              }
      20:              log.Close();

    效果图:

    image

    也可以调试查看生成的SQL

    image

     

    2.3 获得数据库连接的信息

         首先我们添加System.Configuration

        imageimage

         然后添加System.Data.Common;

          代码如下:

       1:   //name在app.config文件中
       2:              string ConnectionStr = ConfigurationManager.ConnectionStrings["linq_Ch5.Properties.Settings.SalesDBConnectionString"].ToString();
       3:              SalesDBDataContext db2 = new SalesDBDataContext(ConnectionStr);
       4:              DbConnection con = db.Connection;
       5:              con.Open();
       6:              Console.WriteLine("连接字符串"+con.ConnectionString);
       7:              Console.WriteLine("数据库名字" + con.Database);
       8:              Console.WriteLine("数据源" + con.DataSource);
       9:              Console.WriteLine("服务器版本" + con.ServerVersion);
      10:              Console.WriteLine("状态" + con.State.ToString());
      11:              Console.WriteLine("执行命令的最大时间" + con.ConnectionTimeout);
      12:              Console.WriteLine("连接超时时间" + con.ConnectionTimeout);

          效果图:

         image

     

    2.4 使用Linq数据源控件

          使用该解决方案,新建个网站

          image

           image

           右键网站,添加一个页面

            image

          image

          同样我们创建dbml文件,拖放好表

          image

          打开Default.aspx页面,从工具箱找到一个LinqDataSource数据源控件,拖放到页面上

          imageimage

    image

    这个页面其实就是让我们构建一个linq语句,说白了,也就是sql语句,完成后,我们点击完成

    image

    我们直接点完成吧,只查询一个products信息表,接下来,我们拖一个gridview控件到Default.aspx页面上,作为宿主

    image

    选择数据源,LinqDataSource1

    image

    我们启用GridView分页和排序

    image

    然后我们点编辑列,把英文名改成中文的

    image

    image

    我们将ID列设为隐藏

    image

    点击完成吧,接下来我们点自动套用格式,选择一个样式,点击完成

    image

    完成后,把表格拖宽一点,太窄了

    image

    将Web项目设为启动项目

    image

    按F5运行网页吧!

    image

     

    2.6 使用SQL Server中的函数过滤数据

       新建一个函数

       1:  ALTER FUNCTION dbo.GetProName
       2:      (
       3:      @procode nvarchar(50)
       4:   
       5:      )
       6:  RETURNS nvarchar(50)
       7:  AS
       8:      BEGIN
       9:      declare @proname nvarchar(50)= '无名称'
      10:          select @proname=ProductName from Products where ProductCode=@procode
      11:      RETURN @proname
      12:      END

    image

    将它拖到dbml文件中去

    image

    代码:

       1:              #region 使用SQLSERVER函数
       2:              var query23 = from o in db.Sales
       3:                            select new
       4:                            {
       5:                                procode = o.ProductCode,
       6:                                proname = db.GetProName(o.ProductCode),
       7:                                num = o.Quantity
       8:                            };
       9:              foreach (var item in query23)
      10:              {
      11:                  Console.WriteLine("产品名字" + item.proname+"   "+"产品编号:"+item.procode);
      12:              }
      13:              #endregion

    效果图:

    image

     

    其实本章博客没有实际意义,只是想完整的讲解一下Linq to SQL

    第一:主外键,大项目不会显式建立的,都是自己逻辑上认为的,因为外键会带来不必要的麻烦

    第二:常见的数据库连接信息没必要的

    第三:使用linq,知道了sql又有什么意义

    第四:数据源控件几乎不使用的

    第五:ASP.NET没ASP.NET MVC好,至少项目不乱,MVC看起来很舒服,cshtml文件全是html代码和@符号的C#代码

    第六:学习快乐,多学无害

    第七:  呵呵

  • 相关阅读:
    Linq to DataTable 左连接
    关于值类型和引用类型
    静态页生成
    技术是什么?
    关于GC垃圾回收的原理
    ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
    Unity3d连接SQL Server数据库出现SocketException: 使用了与请求的协议不兼容的地址错误
    JAVA/GUI程序之记事本
    面试常见题
    unsafe
  • 原文地址:https://www.cnblogs.com/kloseking/p/3168044.html
Copyright © 2011-2022 走看看