当前位置: 首页 > news >正文

C# 3.0 入门系列(一)

谈到dlinq,就不得不先说linq。让我们先看看什么是linq。linq是Language Integrated Query的缩写。那么事实上dlinq就是Database Language Integrated Query的缩写。linq和dlinq最大的区别就在与linq是对内存进行操作,而dlinq的操作对象为数据库。
我们先来看一个linq的例子。在这之前,你需要安装s2008 beta2版本。可以到
http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx 下载。如果,你的机器上是vs2005的英文版,你还需要安装一个linq preview版本。你可以到下面地址去下载。
http://www.microsoft.com/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&displaylang=en
微软也提供了好多学习的地方。先给出几个链结。
http://msdn.microsoft.com/data/ref/linq/
http://msdn.microsoft.com/data/ref/linq/default.aspx?pull=/library/en-us/dndotnet/html/linqprojectovw.asp
http://msdn.microsoft.com/vcsharp/future/

好,我们先来看一个linq的例子。这个例子可以从linq的说明文档上得到。
the linq sample
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1usingSystem;
2usingSystem.Query;
3usingSystem.Collections.Generic;
4
5classapp{
6staticvoidMain(){
7string[]names={"Burke","Connor","Frank",
8"Everett","Albert","George",
9"Harris","David"}
;
10
11IEnumerable<string>expr=fromsinnames
12wheres.Length==5
13orderbys
14selects.ToUpper();
15
16foreach(stringiteminexpr)
17Console.WriteLine(item);
18}

19}

20


你可能感觉比较陌生。放心,这大概是第一次看到缘故。在这里像 from,where,orderby, select等都是linq的保留字,都该用蓝色显示的,但是好像cnblogs还没有开始支持。所以插入代码时,他们就被当作普通字符了。

其实,query expression看起来和sql语句很像。 比如 select * from table1 where column1 = "";
我第一次看到linq时,就感觉是写在程序里的sql语句。只不过,以前我们都是用string类型形成一个sql语句,然后通过command或adapter传到sql server中。而现在,感觉就像把sql语句直接当成程序代码来实现。这只不过是我们的一个错觉。

这个例子,只不过是从一个string的数组中,提取出长度为5的,并且把提取的数据全部变成大写。IEnumerable<string> 使用到了c#2.0中的泛型。 该列子的结果,返回一个数据集,存放到expr中。 在这里,从那个数据集中取的结果,是用in 表达的,如列所示,from s in names , 在names集合中,取出s。s代表一条条纪录。where 表示条件,orderby 表示按什么排序。select 选择那些字段组成变量。这里,你可能会觉得奇怪,s变量在那里声明的呢。我第一看到这里的时候,也感到奇怪。其实s变量是names变量里的元素,你在in names 时,已经声明了s变量。

在这个列子中,大家可以先感受一下linq,在随后的章节中,我会为大家介绍更多。对内存数组的查询,并不能显示出linq的强大功能,对数据库的操作,才使得linq更加具有实际意义。
在随后的章节中,我将逐渐介绍dlinq的语法。
http://www.cnblogs.com/126/archive/2006/08/14/476800.html

在第一篇中,我已经和大家简单介绍了linq。也和大家提起linq是C# 3.0里的一个特性。不过,你去装linq priview时,你会发现,它提供了许多vb的linq代码。从现在的情况看,linq会被移植到.net framework下。在本篇中,笔者将开始更加详细的介绍dlinq。同时,也会介绍很实用的技巧和方法。在这之前,你需要安装s2008 beta2版本。可以到
http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx 下载。如果,你的机器上是vs2005的英文版,你还需要安装一个linq preview版本。你可以到下面地址去下载。
http://www.microsoft.com/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&displaylang=en
以后的章节中,笔者将会配合这个版本,进行讲解,并对它里面提供的例子进行详细的说明。

安装linq preview后,你可以在安装目录下,找到安装程序提供的例子。C# 的应该在C:\Program Files\LINQ Preview\C#\Samples\SampleQueries目录下。打开该工程。因为dlinq主要是对数据库进行操作,你还需要准备数据库。例程给你提供的数据库是用.\SQLEXPRESS来实现的。说实话,这个版本的数据库实在是难用。我建议大家使用SQL2000 or SQL2005. 你可以在C:\Program Files\LINQ Preview\Data目录下找到一个叫做NORTHWND的数据库文件。如图所示,把它附加到你的服务器上。因为NORTHWND是SQL SERVER附带的例子数据库,你可能需要将原来的删掉,才能附加新的上去。
你也可以到http://msdn2.microsoft.com/en-us/bb330936.aspx 下载for beta2的sample。其数据文件的路径为,LinqSamples\SampleQueries\Data

你在附加这个数据库的时候,有可能碰到SQL2000 附加不上去的问题。你可以给我留言,我这里有SQL2000 的数据库备份。在附加完数据库后,你需要修改程序文件了,让SampleQueries的程序使用你刚附加的数据库。打开SampleQueries的程序,在Solution Explorer中找到DLinqSamples.cs文件,打开它,找到24行。如下的代码。

private readonly static string connString = " AttachDBFileName=' " + dbPath + " ';Server=' " + sqlServerInstance + " ';IntegratedSecurity=SSPI;enlist=false " ;

将它替换为

private readonly static string connString = " Server=yourSever;Database=northwind;User=yourname;Password=yourPassword " ;

这样,你就可以使用你刚附加的数据库了。或许你要问为什么非要用这个新的数据库,为什么不用SQL SERVER附带,那是因为在这个新的数据库中,我们添加了许多新的东西。^_^

一切都准备好以后,我们就可以来看这个例子了。笔者在这么没有兴趣讲解SampleQueries是如何设计的,也没有兴趣讲解它是如何取到code的。这里我们只讲dlinq。先让我们来看看大体的一个界面。

界面做的很漂亮也很简洁。选择左边目录树,第一个主接点是linq的101例子,前面我也和大家讲过来linq的主要是针对内存操作。dlinq才是针对数据库操作。我们的重点依然在dlinq上。如图所示,选择where接点中第一个,然后右边代码区会显示该段代码,点run sample!,下面会首先出现程序翻译的sql语句,再下面是返回的数据集。

在正式讲解dlinq的语法前,笔者也许还要把northwind数据库中的表以及表之间的关系简单地和大家交代下。
几个表的关系如上图。我们常用的几个要说明下。一个是Customers表为客户表,一个是Orders表为订单表,一个是Products表为产品表,最后一个是Order Details表,为订单详细表。因为northwind是大家已经很熟悉的一个数据库,我就不再做赘言。 下章,我将依然为大家准备最关键的一个环节,影射文件。

从本节开始,笔者将会和大家一起开始体验dlinq了。前面我们准备了数据库,也对数据库之间的关系做了初步的了解。有了数据库之后,数据和对象是一个什么样的关系呢?从dlinq的设计来看,它主要是为了解决data!=objects 的问题而产生的。那么,现在,有了dlinq后数据和对象之间就可以有一个一一对应的关系了。我们既可以根据数据库生成这种影射的代码,也可以根据影射代码生成数据库。简单的说,数据库和影射代码实现了相互转化。linq preview提供了一个很好的工具,可以帮我们实现从数据库到代码的影射。它就是sqlmetal。beta2的sqlmetal在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin目录下,或C:\WINDOWS\Microsoft.NET\Framework\v3.5目录

打开cmd,运行sqlmetal程序。会出现下面的提示。
运行如下的命令。 sqlmetal /server:myserver /database:northwind /namespace:nwind /code:nwind.cs
/language:csharp
你可以根据northwind数据库生成一个nwind.cs文件。你会在 linq priview的bin目录发现它^_^ 。这里的参数的含义也非常的明确,笔者也不在多赘述。

在这里,我想和大家简要介绍下这个影射文件nwind.cs.因为这个是程序自动生成的,我们暂时最好不要改,在后面的进阶中,我将为大家详细阐述此文件中code的含义,以及实现inheritance.
我们先来看Northwind 类的定义。
public partial class Northwind : DataContext {....
首先partial关键词是C#2.0中出现的,本文不是讲解C#2.0的,相关知识请参阅相关文献。Northwind 的名字是根据你数据库的名字定义的.我们发现,它必须从DataContext 类继承,才可以获得dlinq的支持。再往下看
public Table<Order> Orders;

public Table<Product> Products;

public Table<OrderDetail> OrderDetails;
Table类是dlinq中定义的,这里他用了一个范性的概念,类似于C++中的模板。但C#和C++还是有区别,C++的泛型模板类似替换,只是编译时用实际类型进行替换,因此对任何类型都可以,但是C#的泛型是在虚拟机级别上的实现,因此在编译时会进行类型检查(引)。Order, Product和OrderDetail等,都是sqlmetal程序根据数据库里对应的表,自动产生的类。也就是class和table是一一对应的。而这样也恰恰实现了object和data的对等。让我们去看看Order的定义吧。我这里只贴出部分。只简单介绍几个点,更加详细内容我会在进介阶段解释,包括inheritance。

[Table(Name = " Orders " )]
public partial class Order:System.Data.DLinq.INotifyPropertyChanging,System.ComponentModel.INotifyPropertyChanged
{
privateint_OrderID;
privatestring_CustomerID;
privateSystem.Nullable<int>_EmployeeID;

…………
publicOrder(){
this._OrderID=default(int);
this._OrderDetails=newEntitySet<OrderDetail>(newNotification<OrderDetail>(this.attach_OrderDetails),newNotification<OrderDetail>(this.detach_OrderDetails));
this._Customer=default(EntityRef<Customer>);
this._Employee=default(EntityRef<Employee>);
this._Shipper=default(EntityRef<Shipper>);
}


[Column(Storage
="_OrderID",DBType="IntNOTNULLIDENTITY",IsPrimaryKey=true,IsDBGenerated=true)]
publicintOrderID{
get{
returnthis._OrderID;
}

}


}




因为影射文件是自动产生的,并不需要我们自己去手动制造,节约了我们大量劳动力。在这里,我们可以看到Order 类必须从两个接口继承,而且还要去实现接口里定义的方法。它还定义了一些私有的变量,这些似乎和数据表里字段没有关系。其实,它在Property里描述着呢。dlinq会为每个数据表的字段定义一个对应Property,然后,会在其上加上attribute,如
[Column(Storage = "_OrderID", DBType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDBGenerated = true)]
用来描述该Property对应数据表那个字段(Storage ),是什么类型(DBType ),是否主键(IsPrimaryKey ),是否自动增(IsDBGenerated )等。在这里,我们暂时先不要对这个文件进行修改,等你对它比较熟悉了之后,你就可以用它自己定义继承,比如product下面还有好多种product呢。我将会在进介中介绍。

有了影射文件后,你是不是跃跃欲试,急于想创建一个自己的linq project了呢?在你安装了linq preview后,选择
file->new->Project. 你会发现比平时多了个选项。如图所示。

选择linq preview后,选择一个linq console application,添上名字,让我们立马开始linq之旅吧。创建好工程后,将你自己前面产生nwind.cs文件加入到工程中,在program.cs中的键入如下代码。

using System;
using System.Collections.Generic;
using System.Text;
using System.Query;
using System.Xml.XLinq;
using System.Data.DLinq;
using System.Data;
using System.Data.SqlClient;
using nwind;

class Program
{
staticvoidMain(string[]args)
{
Northwinddb
=newNorthwind("YourConnectionString");

varq
=fromcindb.Customers
selectc;
foreach(varcinq)
{
Console.WriteLine(c.ContactName);
}


}



}




运行,哈哈,你的第一个linq preview的工程跑起来了,开心伐。呵呵,好从下章开始,笔者将着重给大家讲解dlinq的语法。从下章开始,本系列将更名为入门系列,呵呵,本来就没有书可读吗。同时将发布在首页精华区,关注dlinq的朋友注意接收哦。

相关文章:

  • C 与 多线程(1)
  • C# 3.0入门(二)
  • 使用weixin-java-miniapp实现微信小程序登录接口
  • Python 下的虚拟环境的使用
  • C#3.0入门系列(三)
  • 一入 Java 深似海 -- S02E02 学习笔记
  • C#3.0入门系列(四)
  • GCC 的简单使用
  • 关于Keil 的一些看法
  • Jackson 简单使用记录
  • java基础设计 开源框架
  • Spring源码学习笔记
  • 正则资料笔记
  • C#接口慨述
  • Inversion of Control 简要笔记
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • ES6系列(二)变量的解构赋值
  • JS笔记四:作用域、变量(函数)提升
  • node 版本过低
  • node和express搭建代理服务器(源码)
  • React Transition Group -- Transition 组件
  • spring boot下thymeleaf全局静态变量配置
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • V4L2视频输入框架概述
  • VuePress 静态网站生成
  • 关于springcloud Gateway中的限流
  • 前端技术周刊 2019-02-11 Serverless
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #vue3 实现前端下载excel文件模板功能
  • (1)(1.13) SiK无线电高级配置(五)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)Unity3DUnity3D在android下调试
  • .Mobi域名介绍
  • .net中调用windows performance记录性能信息
  • .sys文件乱码_python vscode输出乱码
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /run/containerd/containerd.sock connect: connection refused
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @Service注解让spring找到你的Service bean
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [<MySQL优化总结>]
  • [2023-年度总结]凡是过往,皆为序章
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [bzoj2957]楼房重建
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C++]C++类基本语法