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

it2022-05-05  44

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是父类

如果你是采用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: }

效果图:

            

②根据外键获得主表信息

    代码如下:

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: }

             

效果图:

 

 

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: }

效果图:

接下来,我们把这条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();

效果图:

也可以调试查看生成的SQL

 

2.3 获得数据库连接的信息

     首先我们添加System.Configuration

   

     然后添加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);

      效果图:

    

 

2.4 使用Linq数据源控件

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

     

      

       右键网站,添加一个页面

       

     

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

     

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

     

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

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

选择数据源,LinqDataSource1

我们启用GridView分页和排序

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

我们将ID列设为隐藏

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

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

将Web项目设为启动项目

按F5运行网页吧!

 

 

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

将它拖到dbml文件中去

代码:

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

 

效果图:

 

 

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

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

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

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

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

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

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

第七:  呵呵

转载于:https://www.cnblogs.com/kloseking/p/3168044.html

相关资源:数据结构—成绩单生成器

最新回复(0)