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

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

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

①根据主键获取子表信息

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

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

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

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

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

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

开始写代码:

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

效果图:

②根据外键获得主表信息

    代码如下:

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

效果图:

 

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

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

代码如下:

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

效果图:

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

使用using System.IO;

代码如下:

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

效果图:

也可以调试查看生成的SQL

 

2.3 获得数据库连接的信息

     首先我们添加System.Configuration

然后添加System.Data.Common;

      代码如下:

  1. 1: //name在app.config文件中
  1. 2: string ConnectionStr = ConfigurationManager.ConnectionStrings["linq_Ch5.Properties.Settings.SalesDBConnectionString"].ToString();
  1. 3: SalesDBDataContext db2 = new SalesDBDataContext(ConnectionStr);
  1. 4: DbConnection con = db.Connection;
  1. 5: con.Open();
  1. 6: Console.WriteLine("连接字符串"+con.ConnectionString);
  1. 7: Console.WriteLine("数据库名字" + con.Database);
  1. 8: Console.WriteLine("数据源" + con.DataSource);
  1. 9: Console.WriteLine("服务器版本" + con.ServerVersion);
  1. 10: Console.WriteLine("状态" + con.State.ToString());
  1. 11: Console.WriteLine("执行命令的最大时间" + con.ConnectionTimeout);
  1. 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. 1: ALTER FUNCTION dbo.GetProName
  1. 2: (
  1. 3: @procode nvarchar(50)
  1. 4:  
  1. 5: )
  1. 6: RETURNS nvarchar(50)
  1. 7: AS
  1. 8: BEGIN
  1. 9: declare @proname nvarchar(50)= '无名称'
  1. 10: select @proname=ProductName from Products where ProductCode=@procode
  1. 11: RETURN @proname
  1. 12: END

将它拖到dbml文件中去

代码:

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

效果图:

 

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

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

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

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

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

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

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

第七:  呵呵

那天有个小孩跟我说LINQ(六)转载的更多相关文章

  1. 那天有个小孩跟我说LINQ(五)转载

    2  LINQ TO SQL(代码下载)      我们以一个简单的销售的业务数据库为例子         表结构很简单:Users(购买者(用户)表),Products(产品信息表),Sales(销 ...

  2. 那天有个小孩跟我说LINQ(七)转载

    1  LINQ TO XML(代码下载)        准备:新建项目 linq_Ch7控制台程序,新建一个XML文件夹,我们就轻松地学习一下吧          XDocument         ...

  3. 那天有个小孩跟我说LINQ(四)转载

    1  LINQ TO SQL(代码下载)       我们以一个酒店管理系统的数据库为例子         表结构很简单:GuestInfo(客人信息表),Room(房间表),RoomType(房间类 ...

  4. 那天有个小孩跟我说LINQ(三)转载

    1  LINQ TO Objects续2(代码下载)      新建项目 linq_Ch3控制台程序    1.1 操作字符串        ①查找字符串中包含的大写字母,字符串是由多个char类型组 ...

  5. 那天有个小孩跟我说LINQ(二)转载

    1  LINQ TO Objects续(代码下载)      新建项目 linq_Ch2控制台程序,新建一个Entity文件夹    1.1 学生成绩查询(练习Join)         有三张表如下 ...

  6. 那天有个小孩跟我说LINQ(一) 转载

    1  LINQ准备(代码下载) 新建项目 linq_Ch1控制台程序,新建一个Entity文件夹     1.1 对象初始化器     在Entity新建一个类Student,代码如下 using S ...

  7. 那天有个小孩跟我说LINQ(八)学会Func

    文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.a ...

  8. 那天有个小孩教我WCF[一][2/3]

    接着上次的继续讲吧 我们开始吧 9.创建数据库 use master go --创建库 if exists(select * from sysdatabases where name='NewsDB' ...

  9. 那天有个小孩教我WCF[一][1/3]

    那天有个小孩教我WCF[一][1/3] 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不细讲,步步教你创建一个简单SOA案例,对WCF有个基本的认识,我不 ...

随机推荐

  1. 文件写操作--WriteLog

    private static void Write(string sMsg, string fileName) { if (sMsg != "") { try { var dir ...

  2. 编译 skia

    0.准备工作 在 https://android.googlesource.com/ 用 git 代码,当然也可以从skia的官方https://code.google.com/p/skia/ 中获取 ...

  3. HW5.22

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  4. Re-enable Alcatraz on Xcode 6.3.2 or newer

    I’ve been using Alcatraz to manage Xcode plug-ins for some time now. After updating to Xcode 6.3.2 a ...

  5. Jquery Ajax的时候 老是返回到 error,是因为json格式不正规的原因

    Jquery Ajax的时候 老是返回到 error,是因为json格式不正规的原因: 怪不得不执行,原来我返回的是{success:true,id:1} 这种不规则的字符串,不是严格的json格式, ...

  6. hdoj 4183 Pahom on Water

    Pahom on Water Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. windows下svn+apache搭建svn服务器

    使用软件: apache_2.0.55-win32-x86-no_ssl.msi Setup-Subversion-1.5.3.msi TortoiseSVN-1.5.10.16879-win32-s ...

  8. 为Android安装BusyBox

    大家是否有过这样的经历,在命令行里输入adb shell,然后使用命令操作你的手机或模拟器,但是那些命令都是常见Linux命令的阉割缩水版,用起来很不爽.是否想过在 Android上使用较完整的she ...

  9. JQuery简单实现锚点链接的平滑滚动

    在平时的项目中,我们经常需要一些特效链接,如果使效果进一步加强,我们可以使点击锚点链接平滑滚动到锚点,下面就来给大家讲解下如何使用jQuery来实现.   一般使用锚点来跳转到页面指定位置的时候,会生 ...

  10. IOI1998 hdu1828 poj1177 Picture

    写了一发扫描线竟然狂WA不止,hdu死活过不了,poj和当时IOI的数据(还花了我1dsdn积分..)都过了. 然后看到谋篇blog里有评论,把数据拿下来发现WA了. 数据是 20 0 1 11 0 ...