那天有个小孩跟我说LINQ(六)

时间:2013年04月11日 | 作者 : aaronyang | 分类 : 那天有个小孩跟我说LINQ | 浏览: 2253次 | 评论 0

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文件中去重新生成了

开始写代码:

  var query20 = from o in db.Users
                      select new
                      {
                          ID = o.ID,
                          UserName = o.UserName,
                          Items = o.Sales
                      };
        foreach (var item in query20)
        {
            Console.WriteLine("用户名为"+item.UserName+"订单信息如下:");
            foreach (var sal in item.Items)
            {
                Console.WriteLine("产品编号:" + sal.ProductCode +"  购买时间:" + sal.CreateDate.ToString("yyyy年MM月dd日"));
            }
           
        }


效果图:

             image

②根据外键获得主表信息

    代码如下:

    var query21 = from o in db.Sales
                      select new
                      {
                          ID = o.ID,
                          ProCode=o.ProductCode,
                          ProName=db.Products.FirstOrDefault(c=>c.ProductCode==o.ProductCode).ProductName,
                          ProQuantity=o.Quantity,
                          CreateDate=o.CreateDate,
                          UserName=o.Users.UserName 
                      };
        foreach (var item in query21)
        {
                Console.WriteLine("产品编号:" + item.ProCode +"   "+ item.ProName+"*"+item.ProQuantity+"  购买人:"+item.UserName+"  购买时间:" + item.CreateDate.ToString("yyyy年MM月dd日"));
        }


效果图:

image

 

 

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

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

          代码如下:

    db.Log=Console.Out;
        var query21 = from o in db.Sales
                      select new
                      {
                          ID = o.ID,
                          ProCode=o.ProductCode,
                          ProName=db.Products.FirstOrDefault(c=>c.ProductCode==o.ProductCode).ProductName,
                          ProQuantity=o.Quantity,
                          CreateDate=o.CreateDate,
                          UserName=o.Users.UserName 
                      };

        foreach (var item in query21)
        {
            Console.WriteLine("产品编号:" + item.ProCode + "   " + item.ProName + "*" + item.ProQuantity + "  购买人:" + item.UserName + "  购买时间:" + item.CreateDate.ToString("yyyy年MM月dd日"));
        }

效果图:

image

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

使用using System.IO;

代码如下:

string filePath = Environment.CurrentDirectory+@"\linq5"+DateTime.Now.ToString("yyyyMMddHHmmddss")+".sql";
        TextWriter log;
        log = System.IO.File.CreateText(filePath);
        db.Log = log;
        var query22 = from o in db.Sales
                      select new
                      {
                          ID = o.ID,
                          ProCode = o.ProductCode,
                          ProName = db.Products.FirstOrDefault(c => c.ProductCode == o.ProductCode).ProductName,
                          ProQuantity = o.Quantity,
                          CreateDate = o.CreateDate,
                          UserName = o.Users.UserName
                      };

        foreach (var item in query22)
        {
            Console.WriteLine("产品编号:" + item.ProCode + "   " + item.ProName + "*" + item.ProQuantity + "  购买人:" + item.UserName + "  购买时间:" + item.CreateDate.ToString("yyyy年MM月dd日"));
        }
        log.Close();

效果图:

image

也可以调试查看生成的SQL

image

 

2.3 获得数据库连接的信息

     首先我们添加System.Configuration

    imageimage

     然后添加System.Data.Common;

      代码如下:

  //name在app.config文件中
          string ConnectionStr = ConfigurationManager.ConnectionStrings["linq_Ch5.Properties.Settings.SalesDBConnectionString"].ToString();
          SalesDBDataContext db2 = new SalesDBDataContext(ConnectionStr);
          DbConnection con = db.Connection;
          con.Open();
          Console.WriteLine("连接字符串"+con.ConnectionString);
          Console.WriteLine("数据库名字" + con.Database);
          Console.WriteLine("数据源" + con.DataSource);
          Console.WriteLine("服务器版本" + con.ServerVersion);
          Console.WriteLine("状态" + con.State.ToString());
          Console.WriteLine("执行命令的最大时间" + con.ConnectionTimeout);
          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中的函数过滤数据

   新建一个函数

  ALTER FUNCTION dbo.GetProName
        (
        @procode nvarchar(50)
     
        )
    RETURNS nvarchar(50)
    AS
        BEGIN
        declare @proname nvarchar(50)= '无名称'
            select @proname=ProductName from Products where ProductCode=@procode
        RETURN @proname
        END


image

将它拖到dbml文件中去

image

代码:

      #region 使用SQLSERVER函数
        var query23 = from o in db.Sales
                      select new
                      {
                          procode = o.ProductCode,
                          proname = db.GetProName(o.ProductCode),
                          num = o.Quantity
                      };
        foreach (var item in query23)
        {
            Console.WriteLine("产品名字" + item.proname+"   "+"产品编号:"+item.procode);
        }
        #endregion

image

 

 

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

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

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

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

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

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

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

%

推荐您阅读更多有关于“LINQ,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

合肥科大智能常年招聘.NET,Java,Web前端,有想找想换工作的私聊我AY唯一QQ:875556003和AY交流

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表