兴国安邦

C# 3.0, Linq, Linq To Sql

博客园 首页 新随笔 联系 订阅 管理
  33 Posts :: 0 Stories :: 553 Comments :: 150 Trackbacks

从本节开始,笔者将会和大家一起开始体验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 
{
        
private int _OrderID;
        
private string _CustomerID;
        
private System.Nullable<int> _EmployeeID;

…………
        
public Order() {
            
this._OrderID = default(int);
            
this._OrderDetails = new EntitySet<OrderDetail>(new Notification<OrderDetail>(this.attach_OrderDetails), new Notification<OrderDetail>(this.detach_OrderDetails));
            
this._Customer = default(EntityRef<Customer>);
            
this._Employee = default(EntityRef<Employee>);
            
this._Shipper = default(EntityRef<Shipper>);
        }


        [Column(Storage 
= "_OrderID", DBType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDBGenerated = true)]
        
public int OrderID {
            
get {
                
return this._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
{
    
static void Main(string[] args)
    
{
        Northwind db 
= new Northwind("Your Connection String");

        var q 
= from c in db.Customers
                 select c;
        
foreach (var c in q)
        
{
            Console.WriteLine(c.ContactName);
        }


    }



}




运行,哈哈,你的第一个linq preview的工程跑起来了,开心伐。呵呵,好从下章开始,笔者将着重给大家讲解dlinq的语法。从下章开始,本系列将更名为入门系列,呵呵,本来就没有书可读吗。同时将发布在首页精华区,关注dlinq的朋友注意接收哦。
posted on 2006-09-06 18:55 Tom Song 阅读(8127) 评论(13)  编辑 收藏 网摘 所属分类: C# 3.0Linq To Sql

Feedback

#1楼 2006-09-08 09:56 wayne1017      
跟着楼主学习^_^
  回复  引用  查看    

#2楼 2006-09-30 12:48 syc[未注册用户]
兄弟,弱弱的问一下,这样写,怎么感觉还是和写sql语句差不多的阿,怎么实现代码和sql语句的分离呢?也就是说怎么样通过操作对象来直接生成sql语句阿?
  回复  引用    

#3楼[楼主] 2006-09-30 13:07 宋国安      
恩,我猜,你大概是问怎么样把sql和c#分离吧?dlinq的查询语句,你可以简单的理解为写在c#语言中的sql。当然,dlinq更多是从object和data之间的映射。
在这之前,我们只是把sql语句形成一个string,然后,通过ado.net传给sql server,返回结果集,而这个sql语句,我就可以放到xml文件中,实现sql和c#语言的分离。
dlinq的实现,是在ado.net和c#2.0的基础上的。它通过自动翻译sql语句,并把结果集创建成对象并返回。而dlinq的查询语句,是c#语言中的一部分,是不可能同语言分开的。
但是,我们也可以用级连的表达式,这种表达式,看起来更像在操作对象。比如
var q = from c in db.Customers
select c;
可以表达为var q = db.Customers.Select(c=> c).ToList();
第一个是标准的查询,它首先会被翻译为第二种级连表达式的形式,再被转化为sql语句返回结果集。 在这里,我使用了ToList()方法,因为dlinq是延迟加载,你真正使用数据的时候,它才给你加载。这点,我会在以后的blog中详细说明。
不知道,这是不是你要的答案。

  回复  引用  查看    

#4楼 2006-12-21 08:18 李永亮      
兄弟,弱弱的问一下
比方说项目在什么情况下适合运用呢?

  回复  引用  查看    

#5楼[楼主] 2006-12-21 11:16 宋国安      
一切围绕数据的项目都可以使用。特别是在项目中缺少sql server方面的专家时,dlinq的强大的功能可以帮我们快速的完成项目。dlinq的推出,是让大家从烦琐的技术细节中解脱出来,更加关注项目的逻辑。但是,提醒一下,使用还未正式发布的技术做项目是有风险的。@李永亮

  回复  引用  查看    

#6楼 2008-04-29 20:45 iloja      
发现一个错误.生成的nwind.cs 不在这里C:\WINDOWS\Microsoft.NET\Framework\v3.5
而是在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin下面
我的机子上是这样,不知道你们的............

  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 492332




相关文章:

相关链接: