﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Kenneth Byron</title><link>http://www.cnblogs.com/KENNETHBYRON/</link><description>WEB DEVELOP,C#,LINQ</description><language>zh-cn</language><lastBuildDate>Sat, 11 Oct 2008 15:33:48 GMT</lastBuildDate><pubDate>Sat, 11 Oct 2008 15:33:48 GMT</pubDate><ttl>60</ttl><item><title>C# 3.0 &amp; LINQ 问题收集帖</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/04/806334.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Wed, 04 Jul 2007 15:13:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/04/806334.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/806334.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/04/806334.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/806334.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/806334.html</trackback:ping><description><![CDATA[<div id="mytextdiv">
<p>
这个帖专门用来收集大家在学习和使用 C# 3.0 和 LINQ Framework 中遇到的问题.<br><br>
对于大家提出的问题,我会 回帖 或者 Email 给大家回复问题的答案和我的解决方案.<br><br>
请留言发出问题,请尽量详细.如果问题复杂或者有代码,大家可以Email我.<br><br>
我的 Email : kennethbyron@gmail.com
</p>
<p class="signature">朱宇<br>2007.7.4</p>
</div><img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/806334.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42945/" target="_blank">[新闻]Google股价跌破329美元 61%员工期权价值归零</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>英文WebCast: .NET LINQ框架 讲师:Luca Bolognese LINQ项目经理</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/04/805469.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Wed, 04 Jul 2007 03:50:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/04/805469.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/805469.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/04/805469.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/805469.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/805469.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p>朱宇注:<br>这个WebCast我个人觉得很好,通过演示可以直观的看出来过渡到C#3.0和使用Linq的好处,希望大家也能受益.<br><br>原Web Cast下载地址:<a href="http://www.microsoft.com/events/EventDetails.aspx?CMTYSvcSource=MSCOMMedia&Params=%7eCMTYDataSvcParams%5e%7earg+Name%3d%22ID%22+Value%3d%221032340926%22%2f%5e%7earg+Name%3d%22ProviderID%22+Value%3d%22A6B43178-497C-4225-BA42-DF595171F04C%22%2f%5e%7earg+Name%3d%22lang%22+Value%3d%22en%22%2f%5e%7earg+Name%3d%22cr%22+Value%3d%22US%22%2f%5e%7esParams%5e%7e%2fsParams%5e%7e%2fCMTYDataSvcParams%5e">.NET Language Integrated Query Framework</a><br><br>因为一个多小时的WebCast内容比较多,所以我将这次的WebCast分为两部分.<br>由于没有联系到Luca Bolognese本人,所以代码是我自己写的.文章中使用注释帮助大家找到每节内容的对应代码.<br><br>代码下载地址:<a href="http://www.cnblogs.com/Files/KENNETHBYRON/LucaBologneseDemo.rar">Luca Bolognese at Tech Ed 2007 Demo</a><br><br>下面我们来看第一部分. </p>
<p>
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98495/r_Slide1.jpg" border=0></div>
1)为什么要使用LINQ?
<div id=imgbox><img height=300 alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98495/r_Slide2.jpg" width=400 border=0></div>
我们并不认为Linq解决了什么大的问题,它实际上是针对目前程序开发中数据和对象之间'阻力抗衡'问题的一个解决方案.现在的程序员有了很好的开发环境,写好代码后可以设置断点,进行调试;如果哪段代码出错了,编译器会弹出提示,给出错误信息,还可以通过智能感知查看代码的上下文环境等等.这些就如同你开着法拉利兜风一样轻松自如,令人愉快.不过当要访问数据的时候问题就来了,这时候的感觉会糟透了!让我们就拿数据库举例吧,它就像一个暗箱,唯一能和它交互的方式就是字符串.我们传给它一个字符串,这家伙会回复给我们一个矩阵结构的数据,并且这些数据完全是弱类型的,编译器不会懂得这些数据的含义,我们不能对这些数据进行调试,当然也没有智能感知的帮助了,这就像回到了十年前.而实际上当我们对XML进行操作的时候也不比对数据库操作轻松多少!如果还拿刚才的法拉利比喻的话,当遇到了数据操作我们就像突然撞车一样.所以,这时候我们常说的'用户体验'就简直是糟透了.<br>尽管如此糟糕,数据操作对于程序开发来说却是一个非常重要的部分.就以查询为例,我们通常的做法是使用一个集合的概念来包装我们所有的成员;在编程语言中我们经常都是创建一个List,向List中添加每一个成员,当需要查询数据时,提交查询语句便可以得到结果,这样一路走来非常顺利,简直就是轻松自如.而LINQ项目就是专门处理刚刚我们提到的这么一系列常规做法.所以有了Linq,我们既可以像平时操作对象一样轻松的操作数据了,与此同时,象查询一类的数据库字符串,也被集成到编程语言中了.这就是LINQ项目的目标.
<p>&nbsp;</p>
<p>2)如何使用LINQ?
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98495/r_Slide3.jpg" border=0></div>
做为开始认识Linq我们先仅介绍查询这部分概念.当在.NET 3.5平台下进行查询时,可以不在象以前那样使用T-SQL语句字符串了,我们可以使用.NET平台下的编程语言进行查询.那么3.5平台下的编程语言都可以查询什么类型的数据呢?当然LINQ提供了对很多类型数据的操作: I)a)Objects(对象),如果你将内存中的对象看作是数据,那么这些对象自身有字段,对象之间有关系,而将它们组合到一起就像存在内存中的一个小数据库.正是得益于这种对集合的查询的概念我们才有了目前的数据对象映射概念,如果仔细想想,我们大家一直都在使用这种方法.试想一下每次使用foreach遍历集合中的每个元素时,我们都是在查询,只是使用了命令性强制性的实现,我们明确地告诉编译器要做什么. 第二种类型是 II)关系型数据库,在启用了LINQ的3.5平台上的ADO.NET中,既可以使用Linq查询内存中的 b)DataSets(数据集),也可以使用Linq查询SQL数据库.我们为操作关系型数据库提供了两种框架:一种是 c)LINQ to SQL(DLinq框架),它为访问关系型数据库提供了一种简单的,直接的,方言式的数据库访问,如果你需要一种简单的数据和实体关系映射框架,LINQ to SQL是最合适的最快速获取数据的框架;另一种关系型数据库操作框架是 d)LINQ to Entities(实体框架),它提供了更复杂的更丰富多样的数据实体映射;假设你的数据模型和你的数据库结构差距比较大,LINQ to Entities便是最好的解决办法.第三种数据阻抗来自 III)e)XML.以上就是LINQ项目要面对的三大对象:对象,关系型数据库,XML.
<p>&nbsp;</p>
<p>3)DEMO : The LINQ Project<br>(注:参考工程项目代码Part I C# 2.0 demo)<br>那么剩下的时间将做一个比较大的演示.<br>首先我会按照大家的习惯写出C#2.0的应用程序,然后我会把这个C#2.0的程序使用C#3.0的新特性改写并接着一点一点地演示我刚刚为大家介绍的内容,那么我们开始吧.<br>我们做演示的应用程序是用来操作客户信息的,所以我们先来写一下客户(Customer)这个类.<br><br>
<pre>class Customer
{
    string _CustomerID;
    string _ContactName;
    string _City;
    public string CustomerID
    {
        get { return _CustomerID; }
        set { _CustomerID = value; }
    }
    public string ContactName
    {
        get { return _ContactName; }
        set { _ContactName = value; }
    }
    public string City
    {
        get { return _City; }
        set { _City = value; }
    }
}</pre>
<br>那么接下来写一下Driver类,该类包含主方法.<br><br>
<pre>class Driver
{
    static void Main(string[] args)
    {  }
}</pre>
<br>我们需要一个方法来读取我们的Customer类的客户数据,我们就把这个方法写在Driver类中吧.<br><br>
<pre>class Driver
{
    static void Main(string[] args)
    {        }
    static IEnumerable&lt;Customer&gt; LoadCustomers()
    {
        List&lt;Customer&gt; customers = new List&lt;Customer&gt;();
        Customer c = new Customer();
        c.CustomerID = "ALFKI";
        c.ContactName = "Maria Anders";
        c.City = "Berlin";
        customers.Add(c);
        #region More Customers
        . . .
        #endregion
        c = new Customer();
        c.CustomerID = "WOLZA";
        c.ContactName = "Zbyszek Piestrzeniewicz";
        c.City = "Warszawa";
        customers.Add(c);
        return customers;
    }
}</pre>
<br>这里我们需要一个Customer对象的集合,所以我在方法中首先创建一个客户对象的List&lt;Customer&gt; customers,然后创建了一个Customer c,对c的每个属性赋值,然后将c添加到List中,最后返回customers.那么现在通过LoadCustomers方法便可以得到一个Customer的数据集合.<br>那么这个应用程序要实现的是找出所在城市名以M开头的城市以及这些城市中的客户总数.假设现在我们在做一个网站,而现在要完成的功能将被作为网站的一个网页.那么现在我需要一个类来代表我所查询出来的结果,所以我们来写一个Result类.<br><br>
<pre>class Result
{
    private string _City;
    private int _Count;
    public string City
    {
        get { return _City; }
        set { _City = value; }
    }
    public int Count
    {
        get { return _Count; }
        set { _Count = value; }
    }
} </pre>
<br>在Result类中,我们需要两个字段,一个string类型的_City来存放城市名,一个int类型的_Count来存放该城市中客户的数量.接下来我们在主方法中写查询操作的实现代码.<br><br>
<pre>static void Main(string[] args)
{
    List&lt;Result&gt; results = new List&lt;Result&gt;();
    foreach (Customer c in LoadCustomers())
    {
        if (c.City.StartsWith("M"))
        {
            Result res = results.Find(
                delegate(Result r) { return c.City == r.City; }
            );
            if (res == null)
            {
                res = new Result();
                res.City = c.City;
                res.Count = 1;
                results.Add(res);
            }
            else
            { res.Count++; };
        }
    }
    foreach (Result r in results)
    {
        Console.WriteLine("City:{0}\tCount:{1}", r.City, r.Count);
    }
}</pre>
<br>首先我们需要一个查询结果的集合, List&lt;Result&gt; results,然后foreach遍历LoadCustomers方法返回的Cusomer集合,如果客户的所在城市是以M开头,看一下查询结果集中有没有和当前客户所在的城市相同的结果类(Result)对象,如果没有说明这是第一次发现该城市,创建一个新的结果类对象,把当前客户的城市赋给该对象的City属性,当然客户数就是1了,最后把该对象加到List&lt;Result&gt;中;如果已经有了,就直接在客户数上加1就可以了.<br>为了方便显示结果,我写了一个简单的小对象ObjectDumper,来代替麻烦的foreach输出.<br><br>
<pre>ObjectDumper.Write(results);</pre>
<br>OK,到现在为止我们用C#2.0完成了这个应用程序,当然大家可以用Dictionary来写出更漂亮的程序来,但是无论怎么样.这些代码都是C#2.0中为了实现功能大家避免不了,一定要写的.那么接下来我们一起来看一下C#3.0为我们带来了什么!<br>(注:参考工程项目代码Part II C# 3.0 demo)<br>1).我们导入一下命名空间.这些名称空间并不是要一次全部导入,只是下面还有关于LINQ Framework各个子框架的演示,所以先把所有演示所需要的命名空间都导入进来.<br><br>
<pre>using System.Linq;
using System.Data.Linq;
using System.Data.SqlClient;
using System.Data.Linq.Mapping;
using System.Xml.Linq;</pre>
<br>2).大家留意一下Customer类,这个类里面有字段,然后我们通过公共属性的getter和setter将字段放出来供程序使用.不过这些字段只用来存储一个值,和程序的业务逻辑并没有任何关系.所以在新版本的C#3.0中.我们可以只设定公共属性,而编译器会自动为我们生成后台的私有字段.所以我们可以将Cusomer类改写成为:<br><br>
<pre>class Customer
{
    public string CustomerID { get; set; }
    public string ContactName { get; set; }
    public string City { get; set; }
}</pre>
<br>3).我们再来看一下这行代码List&lt;Result&gt; results = new List&lt;Result&gt;();不知道大家有没有觉得这里有些代码是多余的?也许有人注意到了,我们写了两次List&lt;Result&gt;,可能大家都希望能把它写得再简单些,那么我们我们可以写成这样: var results = new List&lt;Result&gt;();我们不再需要告诉编译器两次results的类型的List&lt;Result&gt;,放一个var在前面占位,编译器会自动将var替换成List&lt;Result&gt;,当我的鼠标移动到var上面,大家可以看到,编译器会提示出这个results对象的类型是List&lt;T&gt;,并且T是Result这个类.同样的,我们也可以将foreach (Customer c in LoadCustomers())中的Customer改写成var,这样当鼠标移动到var上我们可以发现编译器仍然知道c的类型是Customer.<br>4).OK,让我们来看看这一段:delegate(Result r) { return c.City == r.City; },这是一段匿名委托代码,匿名委托的作用是创建一段函数体来代替一个方法.不过匿名方法的写法和理解上还是非常不方便的,所以我们现在有了新的语法,我们可以这样写:<br><br>
<pre>Result res = results.Find( customer =&gt; customer.City == c.City );</pre>
<br>我们称这种语法为lambda表达式,这是书写委托更好的方式,更易于书写,更易于阅读.<br>5).接着往下看这一段:<br><br>
<pre>res = new Result();
res.City = c.City;
res.Count = 1;
results.Add(res);</pre>
<br>创建一个Result对象为每一个属性赋值,然后添加到集合中.C#3.0为我们提供了一种更易于书写创建对象的语法,我们可以通过这样一段代码重写上面的这一段:<br><br>
<pre>results.Add(new Result() { City = c.City, Count = 1 });</pre>
<br>这行代码也是创建了一个Result对象然后直接为这个对象的各个属性赋值,这样便可以方便的只用一行代码同时创建并初始化一个对象.可能有人会问,既然我们可以这样创建初始化一个对象,那么集合可以这样操作么?当然可以,我们可以以同样的办法创建并初始化集合.再来回头看看程序的LoadCustomers方法,我们完全可以改写成下面这段代码:<br><br>
<pre>static IEnumerable&lt;Customer&gt; LoadCustomers()
{
    var customers = new List&lt;Customer&gt;
    {
        new Customer{ CustomerID = "ALFKI",
                               ContactName = "Maria Anders",
                               City = "Berlin" },
        #region More Customers
        . . .
        #endregion
        new Customer{ CustomerID = "WOLZA",
                               ContactName = "Zbyszek Piestrzeniewicz",
                               City = "Warszawa" }
    };
    return customers;
}</pre>
<br>这里使用了新语法集合初始化器,先是创建了一个List&lt;Customer&gt;,然后立即初始化这个集合中的各个Customer对象.这里大家可以看到我们初始化一个集合时也不再像以前一样需要不断的创建对象添加对象,只需要简简单单的将集合中的每个元素跟在集合后面就可以了,非常方便.<br><br>到此呢,我们把原来的代码以一种更简单的新语法改写了一下.不过如果有人认真观察,认真思考了的话,可能会有上当的感觉,尽管我们介绍了C#3.0的一些新语法,可是到此刻我们并没有改变过这个应用程序实质性代码,只不过是简化简化这,简化简化那而已.是的,事实上到现在才真正开进入正题.大家来看一下这段代码:<br><br>
<pre>var results = new List<result>();
foreach (var c in LoadCustomers())
{
    if (c.City.StartsWith("M"))
    {
        Result res = results.Find(customer =&gt; customer.City == c.City);
        if (res == null)
        { results.Add(new Result() { City = c.City, Count = 1 }); }
        else
        { res.Count++; }
    }
}</pre>
<br>这段代码没什么错,只是它有一点点太强制性了,并且它太过&#8217;低级&#8217;.它告诉编译器要遍历每一个集合中的元素,并指明了找到符合条件的元素后怎么样处理.这不是仅仅是程序的梗概,而是写明了程序每一个细节,具体到不能再具体.我想大家都希望有一种更好的方法来完成这段代码,我认为LINQ为大家提供了这个更好的方法.使用Linq我们来重写一下上面功能的代码.<br><br>
<pre>var results = from c in LoadCustomers()
                       where c.City.StartsWith("M")
                       group c by c.City into g
                       select new Result { City = g.Key, Count = g.Count() };</pre>
<br>从LoadCustomers返回的集合中遍历每一个Customer类的对象c,找出c的城市名以M开头的,再将满足条件的c根据c的城市名分组放在g里面,最后我们挑选出Result结果集,结果集中的城市名是分组的关键字也就是c的城市名,而数量便是g中每个分组里面的元素个数,就是这样.<br>如果大家联想一下,这段代码很可能会让大家想起SQL,尽管有些不一样的地方,不过我想这段代码很好理解.但是现在我想带着大家从另一个不同的角度再来看一遍这段代码,大家仔细看看这段查询代码的各个子句.我们一个子句一个子句的说,from子句为我们给出了一个对象的集合;from子句后面是where子句,where子句在from子句给出的集合中进行筛选,选出符合条件的一组对象,实际上where子句最终得到的是from子句集合的一个子集;where子句后面是group子句,group子句得到where子句的集合后将他们按照条件进行分组,将同一类型的对象归到一组里,最后返回一个装有多个组的集合;最后是select子句获得group子句分过组的集合,然后根据这组数据来创建Result结果集.如果大家对这部分细节或者语言背后的详细实现感兴趣,想深入了解,那么大家可以参考另一个演示&#8217;Microsoft Visual C# Under the Covers:An In-Depth Look at C# 3.0&#8217;.<br><br>我们回到正题,接下来需要大家注意的一点是LoadCustomers这个方法的返回值.LoadCustomers这个方法的返回值类型是IEnumerable&lt;T&gt;.正因为LoadCustomers方法的返回值类型是IEnumerable&lt;T&gt;,所以我们才可以使用Linq查询这些数据.大家注意一下,在.NET类库中,所有的集合都是IEnumerable&lt;T&gt;类型,而类库中几乎所有作为返回值的集合也都是IEnumerable&lt;T&gt;类型,所以基本上不需要改变原来的类库代码,我们就可以在原有的程序框架上使用Linq.<br><br>再看看我们现在的代码,还有一处不尽人意的地方,就是下面这段中的Result类<br><br>
<pre>select new Result { City = g.Key, Count = g.Count() };</pre>
<br>在我的应用程序中并不需要一个叫做Result的类,程序的所有逻辑也都和Result类无关.之所有我们写Result类仅仅是为了定义查询结果返回的数据结构和数据类型,那么假设我的程序中有几百种返回值不同的查询,那么我就需要写几百个类来定义这些查询结果的类型,这种做法非常麻烦繁琐.所以我们来改写两处: a)删除Result类的定义和 b)select子句中的Result类型.<br><br>
<pre>select new { City = g.Key, Count = g.Count() };</pre>
<br>这个新特性的关键就是上面这种格式代码的,这种新特性叫做匿名类型.具体实现的过程大致是:当你没有指定一个对象初始化器的类型,那么编译器识别到了对象初始化器后会自动指定一个类型,并为这个类型取一个编译时类型名,当然这个编译时类型名你既不需要知道,也不可能知道.关键是这种新特性使大家不再需要为一些与程序逻辑和程序概念无关的对象创建单独的类,就像在这里,我们就完全没有必要仅仅为一个查询结果特意定义一个类型.<br><br>到现在,我们的程序还有一点是很不现实的,大多数时候程序是从外部数据源读取出数据,而不是将数据写在程序中.那么回到LoadCustomers方法中,我们去掉对customers集合的定义.在项目的DEBUG目录中,我们准备了一个名叫Customers的XML文档,该文档记录了所有的客户信息,那么接下来让我们来看看如何从XML文档中检索出这些客户信息.<br>要完成这个,我们需要LINQ的一个组成部分叫做LINQ to XML,那么我们就使用XLinq来读取这些数据.<br>(注:参考工程项目代码Part III Types of Datasources demo 1st. XML Datasource)<br><br>
<pre>static IEnumerable&lt;Customer&gt; LoadCustomers()
{
    var customers = from x in XElement.Load("Customers.xml").Elements("Customers")
    select new Customer
                    {
                        ContactName = x.Element("ContactName").Value,
                        City = x.Element("FullAddress").Element("City").Value
                    };
    return customers;
}</pre>
<br>我们还是使用查询,从Customers.xml中取得所有叫做Customers的元素,然后使用select创建出每一个Customer对象,并使用XML中查询出来的值初始化Customer对象的各个属性.然后返回这个customers集合.如果我们现在再运行程序,会发现结果根本没有任何改变,唯一不同的是这次运行,程序的数据不是我们手工写在代码里,而是从XML中读取出来的.<br>这段代码我们使用XLinq来解析一个XML文档,取出数据,并根据这些数据来创建对象集合.而这样的工作现在只须简单的一行代码就可以完成,我们没必要再为繁琐的XML读取和不断的创建对象而发愁了,工作变得简单,顺畅.<br>还有一种常见的数据来源:强类型数据集.假设程序的底层有另一个应用程序为我们现在的这个程序提供数据,而低层提供给我们的数据存储在一个数据集中,那么就需要我们使用Linq来从数据集中查询数据.<br>那么我们写段代码来实现这项操作.<br>(注:参考工程项目代码Part III Types of Datasources demo 2nd Typed Dataset Datasource)<br><br>
<pre>static CustomersDataSet.CustomersDataTable LoadCustomers()
{
    SqlDataAdapter adapter = new SqlDataAdapter
                                                 (
                                                     "SELECT * FROM Customers",
                                                     @"Data Source=.\SQLEXPRESS;" +
                                                     @"AttachDbFilename=|DataDirectory|\NORTHWND.MDF;" +
                                                     @"Integrated Security=True;" +
                                                     @"User Instance=True"
                                                 );
    CustomersDataSet.CustomersDataTable table = new CustomersDataSet.CustomersDataTable();
    adapter.Fill(table);
    return table;
}</pre>
<br>这一段是一段非常简单的方法.我们构造了一个数据适配器,指定了数据适配器的查询语句和连接字符串.之后创建了一个数据集中的数据表对象,使用数据适配器填充了数据表,最后返回这张表.<br>那么运行结果和前两次都是一样的,但是这一次数据是从数据集中取出来的.<br>这里希望大家留意一下,虽然我不断的修改LoadCustomers方法,不过我查询的语句一直没有修改过,无论我是从手工定义的对象结合中取数据,或者从XML中取数据,还是从数据集中取数据,Linq查询语句一直都保持不变,我们只需要修改数据来源.<br><br>那么这些是现实中的程序的做法,但是在理想化的情况下,我们并不想使用这些中间数据源,不想记忆那些无聊的数据集图式结构;相反我们有时候希望可以直接传递SQL查询,这样一来我们可以省掉中间机制直接与数据库交互.那么我们去掉LoadCustomers方法,来一步一步试一下新的做法.<br>(注:参考工程项目代码Part IV DLinq demo 1 Custom Model)<br>首先,我们使用Northwind数据库,Northwind中有一张Customers表,而我们的程序中有一个Customer类,那么我们现在想做的是告诉.NET框架,我们希望将Customer类对象的数据存储在Customers表中.<br><br>
<pre>[Table(Name="Customers")]
class Customer
{
    [Column]
    public string CustomerID { get; set; }
    [Column]
    public string ContactName { get; set; }
    [Column]
    public string City { get; set; }
}</pre>
<br>这里我们使用自定义标记来告诉.NET框架这种信息.首先我们希望Customer类的对象存储在Customers表中,所以加一个Name属性来标记表名.然后类中的每一个属性对应库中表的一个列,这里因为属性名和列名一致,所以我们不需要额外标记.这样就完成了类结构和表结构的映射.<br>完成了映射之后,我们就可以通过连接字符串构造一个数据上下文(DataContext)对象来连接到数据库,然后我们使用这个对象来获取数据源,也就是Customers表.<br>具体的实现代码如下:<br><br>
<pre>static void Main(string[] args)
{
    DataContext db = new DataContext
                                     (
                                         @"Data Source=.\SQLEXPRESS;" +
                                         @"AttachDbFilename=|DataDirectory|\NORTHWND.MDF;" +
                                         @"Integrated Security=True;" +
                                         @"User Instance=True"
                                     );
    var results = from c in db.GetTable&lt;Customer&gt;()
                       where c.City.StartsWith("M")
                       group c by c.City into g
                       select new { City = g.Key, Count = g.Count() };
    ObjectDumper.Write(results);
}</pre>
<br>如果现在我们再来运行,结果依然和之前的一样,而不同的是这一次我们的数据是直接从数据库中检索出来的.为了大家可以更清晰的看到数据从数据库是如何查询出来的,我们在刚刚的代码中加上一句话:<br><br>
<pre>db.Log = Console.Out;</pre>
<br>这样,传递给数据库的SQL语句便会打印在屏幕上.<br>这里特意说明一下,实际上这次查询和我之前跟大家说得查询时完全矛盾的.记得之前我和大家解释了一下IEnumerable&lt;T&gt;,比如我们之前使用的LoadCustomers方法返回值类型为IEnumerable&lt;T&gt;.所以当我们使用var results = from c in LoadCustomers()时,Linq便在这个IEnumerable&lt;T&gt;中进行遍历查询.但是这次当我们使用了var results = from c in db.GetTable&lt;Customer&gt;()时,Linq却发送了一个SQL语句给数据库.这种矛盾的原因在于LoadCustomers的返回值类型是IEnumerable&lt;T&gt;,而db.GetTable&lt;Customer&gt;()返回值类型却不是IEnumerable&lt;T&gt;,而是IQueryable&lt;T&gt;.编译器发现结果是IQueryable&lt;T&gt;,便不会再遍历IEnumerable&lt;T&gt;,相反,编译器会将整个Linq查询语句转换成对象模型来代表查询,然后将对象模型作为IQueryable&lt;T&gt;的具体实现.从编译器角度来看,编译器并不清楚当前正在执行的是在LINQ to SQL;你可以创建一个你自己的IQueryable&lt;T&gt;的具体实现,那么当编译器发现了IQueryable&lt;T&gt;被载入,编译器便会接受查询语句,根据查询语句创建对象模型,最后将对象模型交给你编写的IQueryable&lt;T&gt;的具体实现.<br>那么LINQ to SQL在幕后作了什么呢?LINQ to SQL实际上接收对象模型,操纵对象模型,创建SQL语句,提交SQL查询到数据库,接收数据库返回的数据,并根据这些数据创建对象,返回对象给Linq查询结果.当然你可以创建自己的IQuerable&lt;T&gt;具体实现来完成完全不同的功能.<br><br>(注:参考工程项目代码Part V Dlinq demo 2 dbml Model)<br>不过,就像我经常挂在嘴边的一句话:这段代码中还有一些令人不满意的地方,那么我们现在的代码还是有一些不足之处.1)就是Customer类的定义中,我不希望每一列都要一个一个的手工添加自定义标记,这些是我们非常不喜欢做的事情,所以我们把Customer类的地方全部去掉;2)我想大家都不希望自己手工指定一个数据库连接字符串吧?大家应该都比较喜欢更亲切一点的数据库连接方法.所以我们把DataContext的实例化代码也去掉;3)当然我们也不希望每次都要写GetTable&lt;Customer&gt;(),我们希望的是当我使用db打个&#8221;.&#8221;后,智能提示会自动将所有可用的表名都给我提供出来.所以我们也去掉GetTable&lt;Customer&gt;().<br>那么接下来的情景大概是这样的:我们有一个数据库,而我们希望不写任何辅助代码的情况下,我就可以直接在程序中访问数据库.所以我们在项目中添加一个Linq to SQL文件,将它命名为Northwind.这时会看到一个设计界面,在设计界面中,可以直接将数据库的表拖入左窗口中.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98495/r_01.jpg" border=0></div>
大家应该留意一下,当我们将两张有关系的表拖进设计视图时,系统会自动设计好关系.所以在代码中就可以直接使用这两者之间的关系.<br>那么这个dbml文件到底作了什么呢?这个文件建立了一系列对象模型来对应数据库和数据库中的表.所以有了这个文件之后,便可以直接回到代码中直接使用这些对象.<br><br>
<pre>static void Main(string[] args)
{
    var db = new NorthwindDataContext();
    var results = from c in db.Customers
                       where c.City.StartsWith("M")
                       group c by c.City into g
                       select new { City = g.Key, Count = g.Count() };
    ObjectDumper.Write(results);
}</pre>
<br>这时测试,依然正常运行,而且运行结果和之前一样.那么这样的代码才是大家平时工作的时候希望写的代码.比如你正在写程序,可是突然需要查询,而你根本没有意识到这一点,继续写代码,因为查询已经变成了平常的普通代码了,有了Linq我想我们已经离这个目标很近了.<br>那么下一个话题来看看存储过程.<br>(注:参考工程项目代码Part VI Dlinq demo 3 Stored Precedure)<br>回到dbml设计窗口我们可以将数据库中的存储过程直接拖放到右窗口.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98495/r_02.jpg" border=0></div>
这是回到代码中,可以非常简单的直接通过db对象来调用存储过程.<br><br>
<pre>static void Main(string[] args)
{
    var db = new NorthwindDataContext();
    var results = db.Customers_By_City("London");
    ObjectDumper.Write(results);
}</pre>
<br>这样的代码就是我们期望的代码,当需要什么的时候,直接使用数据库调用,就像调用方法一样传进去参数就可以了,一切流畅顺利.<br><br>到这里先停一下,来回头看看刚刚谈过的都有什么:1)创建了一个C#2.0的应用程序,2)经2.0应用程序转化成了C#3.0,3)在应用程序中我们添加了Linq查询,4)从普通的集合中读取数据,5)从XML文档中读取数据,6)从数据集中读取数据,7)从数据库中读取数据.<br><br>注:今天就先到这里.第二部分内容 LINQ to XML 下次再为大家放出.
<p>&nbsp;</p>
<p class=signature>朱宇<br>2007.7.4</p>
</div><img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/805469.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42945/" target="_blank">[新闻]Google股价跌破329美元 61%员工期权价值归零</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Linq How do I #3</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804021.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Tue, 03 Jul 2007 03:18:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804021.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/804021.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/804021.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/804021.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p>今天我们来试一试如何对查询结果进行简单的处理.<br>首先回忆一下上次做的东西,从Petshop4中找出了部分宠物,那么今天试一下其他很可能发生在日常工作中的业务需要.比如,统计一下一共有多少种宠物,每种宠物有多少只,她们都叫什么?按升降序排列一下,或者找出名字首字母在特定字符中的宠物.这些都是日常工作中常见的.废话少说,Let&#8217;s do it!<br>咱们一个一个来,先看一下上次查询的结果.
<div id=imgbox><img src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98388/r_01.jpg"></div>
那么这一次,客户希望不要乱打印一通,按字母顺序打印出所有的宠物名.OK.实际上不就是排个顺序么,如果是SQL查询.只要加上ORDER BY不就行了么?那么在Linq中我们也是通过这种方法实现.在原来的代码中加上orderby.<br><br><code>var query = from pet in db.Products<br>where pet.CategoryId == "BUGS"<br>orderby pet.Name<br>select pet; </code><br>有人问,那要是降序呢?还有说么!当然是descending了. <code>orderby pet.Name descending</code> 看看结果,这回顺序不乱了.呵呵.
<div id=imgbox><img src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98388/r_02.jpg"></div>
第一个问题搞定.回头看看统计.要统计就涉及到分组,我们也象SQL查询一样使用GROUP BY子句.不过这里有些地方要说明的,我们先来看看代码.<br><br><code>var query = from pet in db.Products<br>group pet by pet.CategoryId into g<br>select new { Key = g.Key, Count = g.Count() };<br><br>foreach (var q in query)<br>Console.WriteLine("Group Name:{0} \t&amp;\t Pets Count:{1}", q.Key, q.Count);<br></code><br>这里面引进了group by子句,乍一看这段代码可能会有些迷惑,g是什么?g的Key又是怎么回事?好象摸不到头尾.我们还是一点一点的来解释吧.<br>看看这段查询,首先可以简化的是select子句,干掉select再来看看.<br><br><code>var query = from pet in db.Products<br>group pet by pet.CategoryId into g </code><br>那么into的意思就是放入,g当然是一个变量了.放入g里的是什么呢?应该是<br><br><code>from pet in db.Products<br>group pet by pet.CategoryId;<br></code><br>也就是数据库Product表中的数据依据CategoryId分组后被放入g了.那么g应该是一个集合.没错,g的原型是这样的public interface IGrouping&lt;TKey,TElement&gt;.而IGrouping的定义如下<br><br><code>public interface IGrouping&lt;TKey, TElement&gt; : IEnumerable&lt;TElement&gt;, IEnumerable<br>{<br>TKey Key { get; }<br>}<br></code><br>这下我们不难发现IGrouping只是在我们原来使用的IEnumerable中加了一个Key,也就是说g也是一个IEnumerable&lt;T&gt;集合,只是g照正常的IEnumerable&lt;T&gt;多了一个Key字段.那在我们的代码中Key将用来存放分组的关键字,即pet.CategoryId,而pet.CategoryId相同的所有对象存在对应g中.比如(下面这段代码只是从实现角度理解,并非真实代码)<br><br><code>Product newpet = new Product { ProductId = "New01", CategoryId = "BUGS",<br>Name = "New Pet 01", Descn = "", <br>Image = "" };<br>g["BUGS"].Elements.Add(newpet);<br></code><br>我想这样大家能好理解一点.当然,我们可以放入g中,也可以不放入,比如下面这段代码,我直接把分组结果赋给了query,这样query便变成了刚刚一直在说的IGrouping&lt;TKey,TElement&gt;.<br><br><code>var query = from pet in db.Products<br>group pet by pet.CategoryId;<br><br>foreach (var q in query)<br>{<br>Console.WriteLine(q.Key);<br>foreach(var item in q)<br>Console.WriteLine(" "+item.Name);<br>Console.WriteLine();<br>}<br></code><br>如果有人在思考,可能会问:既然这么写可以,为什么还要多放置一个g集合呢?<br>答案是:为了将结果传给select子句使用,在分组完成之后我们创建了一个匿名类型对象,并调用g集合为该对象初始化.再来看一次最初的代码:<br><br><code>var query = from pet in db.Products<br>group pet by pet.CategoryId into g<br>select new { Key = g.Key, Count = g.Count() };<br></code><br>运行结果<br>
<div id=imgbox><img src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98388/r_03.jpg"></div>
分组今天就先说到这吧,更深一些的理解我会再以后的In Depth系列中为大家解释.<br>继续回到where子句,看看如何筛选出名字首字母在特定字符集中的宠物.就让我们选出虫子中名字的首字母在B到S之间的吧.<br><br><code>var query = from pet in db.Products<br>where pet.CategoryId == "BUGS" &amp;&amp; pet.Name[0] &gt; 'B' &amp;&amp; pet.Name[0] &lt; 'S'<br>select pet;<br>foreach (var bug in query)<br>Console.WriteLine("Pet ID : {0}, Pet Name : {1};", bug.ProductId, bug.Name);<br></code><br>这其实也没什么可说的,我就不解释了,省得浪费大家时间,呵呵,不明白的写信给我,我再为你解释吧.咱们直接看看结果.<br>
<div id=imgbox><img src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98388/r_04.jpg"></div>
今天罗嗦到这.下次见.<br>
<p>&nbsp;</p>
<p class=signature>朱宇<br>2007.7.3</p>
</div>
 <img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/804021.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42944/" target="_blank">[新闻]十年祭:昔日明星软件今何在?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Linq How do I #2</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804008.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Tue, 03 Jul 2007 03:08:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804008.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/804008.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804008.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/804008.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/804008.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p>今天要做的是使用LINQ从一个数据库中查询出我们想要的数据.<br>Northwind?哈哈,总用Northwind烦不烦啊?我想大家跟我的想法差不多一样吧?那么作为事例的数据库,试试微软的MSPetShop4吧.在MSPetShop4的Product表中存储了很多有关宠物的信息.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_01.jpg" border=0></div>
就从这些宠物中查询出我们想要的宠物吧.说干就干.Let&#8217;s do it.<br>首先,建立一个工程.名字嘛,我就用系列名了.你们随意.(能干的干了.不能干的我也不强求)
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_02.jpg" border=0></div>
接下来.来建立数据库.脚本我放在工程中的DemoDBScript文件夹中了.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_03.jpg" border=0></div>
OK.数据库有了,为工程配置一下数据库连接.打开Server Explorer.添加一个新的数据库连接.因为我在脚本里定义了数据库的用户.所以大家可以使用用户名mspetshop和密码pass@word1进行登陆.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_04.jpg" border=0></div>
配置成功后可以看到Product表.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_05.jpg" border=0></div>
接下来为项目添加一个LINQtoSQL文件.就起数据库名吧.一般我们都是用数据库名命名LINQtoSQL的.LINQtoSQL文件的作用是定义一堆类.这些类和类中的属性会分别对应数据库.表.行.列.关系.函数.存储过程等所有SQL Server数据库对象.因为它的扩展名为dbml所以接下来我叫它dbml文件.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_06.jpg" border=0></div>
建立完成后VS会自动切换到LINQtoSQL的设计界面.Bug出现喽.每次切换到这个截面,VS都会打开Error List Panel.毙了它.呵呵.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_07.jpg" border=0></div>
这时查看一下该文件的源代码.打开dbml下面的MSPetshop4.designer.cs
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_08.jpg" border=0></div>
可以发现如下程序段:<br><br><code>public partial class MSPetShop4DataContext : global::System.Data.Linq.DataContext <br>{<br>[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]<br>public MSPetShop4DataContext(string connection) : <br>base(connection) {<br>}<br><br>[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]<br>public MSPetShop4DataContext(global::System.Data.IDbConnection connection) : <br>base(connection) {<br>}<br>}<br></code><br>这就是一个dbml文件初始时的代码.其中我们会发现一个MSPetShop4DataContext的类.这个类对应数据库.也就是说当一个dbml文件被创建时.它必须对应一个数据库.而有了dbml文件就可以通过MSPetShop4DataContext db = new MSPetShop4DataContext();取得一个数据库的对象.这也是为什么习惯性的用数据库名称命名一个dbml文件.至于对象名嘛.一般用数据库名或db.db更常用一点.因为我懒.大家都懒.呵呵.如果我们将一个数据库抽象成一个类.按照数据库结构来分析.这个数据库类应该包含表这个类的对象.接下来.我们为数据库类中添加表的类.点一下dbml设计视用的Server Explorer并将Product表拖到设计视图中来.
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_09.jpg" border=0></div>
哈哈.看着眼熟么.这不就是类设计器中的一个类吗?!再看看dbml的源代码会发现增加了对表类的定义.<br><code>[global::System.Data.Linq.Table(Name="dbo.Product")]<br>public partial class Product : global::System.Data.Linq.INotifyPropertyChanging, global::System.ComponentModel.INotifyPropertyChanged <br>{<br>private string _ProductId;<br>private string _CategoryId;<br>private string _Name;<br>private string _Descn;<br>private string _Image;<br>[global::System.Data.Linq.Column(Storage="_ProductId", Name="ProductId", DBType="VarChar(10) NOT NULL", IsPrimaryKey=true, CanBeNull=false)]<br>public string ProductId {<br>get {<br>return this._ProductId;<br>}<br>set {<br>if ((this._ProductId != value)) {<br>this.OnPropertyChanging("ProductId");<br>this._ProductId = value;<br>this.OnPropertyChanged("ProductId");<br>}<br>}<br>}<br><br>[global::System.Data.Linq.Column(Storage="_CategoryId", Name="CategoryId", DBType="VarChar(10) NOT NULL", CanBeNull=false)]<br>public string CategoryId {<br>get {<br>return this._CategoryId;<br>}<br>set {<br>if ((this._CategoryId != value)) {<br>this.OnPropertyChanging("CategoryId");<br>this._CategoryId = value;<br>this.OnPropertyChanged("CategoryId");<br>}<br>}<br>}<br><br>[global::System.Data.Linq.Column(Storage="_Name", Name="Name", DBType="VarChar(80)")]<br>public string Name {<br>get {<br>return this._Name;<br>}<br>set {<br>if ((this._Name != value)) {<br>this.OnPropertyChanging("Name");<br>this._Name = value;<br>this.OnPropertyChanged("Name");<br>}<br>}<br>}<br><br>[global::System.Data.Linq.Column(Storage="_Descn", Name="Descn", DBType="VarChar(255)")]<br>public string Descn {<br>get {<br>return this._Descn;<br>}<br>set {<br>if ((this._Descn != value)) {<br>this.OnPropertyChanging("Descn");<br>this._Descn = value;<br>this.OnPropertyChanged("Descn");<br>}<br>}<br>}<br>[global::System.Data.Linq.Column(Storage="_Image", Name="Image", DBType="VarChar(80)")]<br>public string Image {<br>get {<br>return this._Image;<br>}<br>set {<br>if ((this._Image != value)) {<br>this.OnPropertyChanging("Image");<br>this._Image = value;<br>this.OnPropertyChanged("Image");<br>}<br>}<br>}<br><br>public event global::System.ComponentModel.PropertyChangedEventHandler PropertyChanging;<br><br>public event global::System.ComponentModel.PropertyChangedEventHandler PropertyChanged;<br><br>[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]<br>protected void OnPropertyChanging(string propertyName) {<br>if ((this.PropertyChanging != null)) {<br>this.PropertyChanging(this, new global::System.ComponentModel.PropertyChangedEventArgs(propertyName));<br>}<br>}<br><br>[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]<br>protected void OnPropertyChanged(string propertyName) {<br>if ((this.PropertyChanged != null)) {<br>this.PropertyChanged(this, new global::System.ComponentModel.PropertyChangedEventArgs(propertyName));<br>}<br>}<br>} </code><br>再看看原来的MSPetShop4DataContext这个类.这个类里面多了下面这段代码:<br><code>public global::System.Data.Linq.Table
<product>Products <br>{<br>get {<br>return this.GetTable
<product>();<br>}<br>}<br></code><br>不难看出这是为MSPetShop4DataContext这个类增加了一个Products属性.<br>好了.表类也有了.那行和列呢?这就是我要给大家特别说明一下的地方.LINQ Framework中并不像传统ADO.NET DataSet那样将行和列定义为类.我们换一种思维方式.回到数据应用层面.一个表中存储的数据实际是对同一种或者一类相似事物描述的集合.而一行实际上是用来描述一个事物的.下一行呢?当然是描述同一类型的另一个事物的.在传统的ADO.NET中.我们在库中的数据依然是以数据的形式从数据库中提取出来供应用程序使用.而新的LINQ Framework为我们生成了这么多类.将传统意义中的数据表行列概念打破.将每一行定义为表名这个类的一个对象.而列呢,作为该对象的每个属性的值.分析一下上面的代码我们来理解一下现在我们所在的应用程序上下文.通过设计dbml文件.我们得到了一个MSPetShop4DataContext类.这个类对应我们的数据库MSPetShop4.也就是说. 我们的数据库MSPetShop4在应用程序中被作为或者说看做是MSPetShop4DataContext类的一个对象.那可以不可以有另外一个MSPetShop4DataContext类的对象呢?暂时你可以认为该类只有我们数据库这一个对象(都说暂时了,当然是以后可以有啦).而这个对象(就用db称呼这个对象吧)db有一个属性.类型是Table
<product>.通过泛型我们可以知道.这张表的每一行数据应该是被作为一个Product类(看到了吧,表名被生成一个类了)的对象看待.而行中的每一列.实际上就是这个对象的各个属性.这些属性会在声明时加上[Column].而表名这个类在声明时会加上[Table].<br>详细的我就不多说了.我会在In Depth系列中为大家详细解释这些的(观众:&#8221;广告,这根本就是广告嘛.&#8221;我:&#8221;我乐意!不爱看拉倒.嘿嘿&#8221;).<br><br>最后我们要开始我们的查询了.大家准备好了么?呵呵.(石头,鸡蛋,西红柿乱飞.底下有人狂喊到:&#8221;你真墨迹&#8221;.- -!我没猜错吧?)<br><br>还记得我们上次说的查询三个步骤么? <br>1.数据源.我们的数据源应该是一个包含很多Product对象的集合.当然就是我们的Product表.而Product表在哪呢?我们刚刚说过.它是db对象的一个属性.所以我们要有db.<br><code>MSPetShop4DataContext db = new MSPetShop4DataContext();</code> db.Products就是我们的数据源了.即<br><code>from pet in db.Products</code> 2.创建查询.在这些宠物中,我们要选出什么样的宠物呢?我喜欢虫子.我们就选出所有虫子类的宠物吧.<br><code>where pet.CategoryId=="BUGS"</code> 3.执行查询.我们来选出所有是虫子的宠物.<br><code>select pet;</code> 这就是我们的查询了.完整代码如下:<br><code>class Program<br>{<br>static void Main(string[] args)<br>{<br>MSPetShop4DataContext db = new MSPetShop4DataContext();<br>var query = from pet in db.Products<br>where pet.CategoryId == "BUGS"<br>select pet;<br>Console.WriteLine("Bug pets in our shop :");<br>foreach (var bug in query)<br>Console.WriteLine("Pet ID : {0}, Pet Name : {1};", bug.ProductId, bug.Name);<br>}<br>} </code><br>看看结果吧!<br>
<div id=imgbox><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/KENNETHBYRON/98387/r_10.jpg" border=0></div>
今天啰唆的有点多.浪费大家时间啦.谢谢支持.<br>不过作业还是不能免地!请大家尝试下从Northwind数据库Customers表中筛选出所有London的客户.我们明天见吧!<br>
<p>&nbsp;</p>
<p class=signature>朱宇<br>2007.7.3 Revised</p>
</div> <img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/804008.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42944/" target="_blank">[新闻]十年祭:昔日明星软件今何在?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Linq How do I #1</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/803981.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Tue, 03 Jul 2007 02:57:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/803981.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/803981.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/803981.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/803981.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/803981.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p>LINQ,全称Language-Integrated Query,翻译过来是语言集成查询.那么作为系列的第一部分.我们先来看看到底如何用语言查询.首先我们看看传统方法:<br><br><code>int[] numbers = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };<br>Console.Write("Evens in numbers are :");<br>foreach(int i in numbers)<br>{<br>if(i%2==0)<br>Console.Write(" "+i);<br>}<br>Console.Write("\n");<br></code><br>这里我们用传统的方法从一个数组中获取了所有偶数.下面我们试着查询一个对象数组.<br><br><code>public class Person<br>{<br>private string _Name;<br>private int _Age;<br>private char _Sex;<br><br>public Person(string name, int age, char sex)<br>{ this._Name = name; this._Age = age; this._Sex = sex; }<br><br>public string Name<br>{ get { return this._Name; } set { this._Name = value; } }<br>public int Age<br>{ get { return this._Age; } set { this._Age = value; } }<br>public char Sex<br>{ get { return this._Sex; } set { this._Sex = value; } }<br>}<br><br>Person[] people = new Person[]{<br>new Person("zhangsan",23,'M'),<br>new Person("lisi",24,'M'),<br>new Person("wangwu",25,'M')<br>};<br>Console.Write("Persons older than 23 are :");<br>foreach (Person p in people)<br>{<br>if (p.Age &gt; 23)<br>Console.Write(" " + p.Name);<br>}<br>Console.Write("\n");<br></code><br>仔细观察以上的代码可以发现,其实在我们查询的时候经过了这么三个过程. <br>1. 获得数据源. foreach (Person p in people) 我们要筛选的数据来自一个Person对象数组. <br>2. 创建一个查询.<br><code>foreach (Person p in people)<br>{ <br>if (p.Age &gt; 23) <br>Console.Write(" " + p.Name);<br>}<br></code>查询的是Person对象数组中的每一个个对象,筛选条件为该对象的年龄要大于23.<br>3. 执行查询. foreach关键字负责执行枚举每一个Person中的p对象.<br><br>下面我们用三个关键字来分别定义以上三个步骤: 1. from(从) 2. where(满足) 3. select(选出).这样翻译是让一条程序语句更象我们平时的思维和表达方式.下面我们将上面的代码的代码用我们的语言表达一次.我们的目标是: 1.从名为people的Person数组中(from p in people),2.找出满足年龄大于23的人(where p.Age&gt;23),3选择全部满足条件的人(select p).<br><br><code>IEnumerable
<person>query = from p in people<br>where p.Age &gt; 23<br>select p;<br>Console.Write("Persons older than 23 are :");<br>foreach (Person p in query)<br>Console.Write(" " + p.Name);<br>Console.Write("\n");<br></code><br>这就是我们今天的How do I目标--完成一个查询.那么试着将第一个数字筛选代码自己写一下吧.<br>为什么这样就可以了呢?这个查询是怎么工作的?这些问题我会在In Depth #1中为大家解释.<br><br>最后给大家一个偷懒的代码,也是上面一个例子查询的答案.在给出代码前,我要跟大家交代一个关键字var.它是什么呢? var是C#3.0中的一个关键字,用来声明变量,当然var并不是一种数据类型它只表示接在它后面的是一个变量.而变量的数据类型由编译器根据代码的上下文推断获得.比如, var i = 20; 编译器在阅读这段代码时,首先得到变量i,这时编译器并不知道i是什么数据类型,接着编译器得到i的值20,因为20是int型,所以编译器定义i为int.在In Depth #1中.我也会为大家说明一下这个过程.好了,下面是在0-9的数组中查询所有双数的代码.<br><br><code>var numbers = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };<br>var evens = from n in numbers<br>where n % 2 == 0<br>select n;<br>Console.Write("Evens in numbers are :");<br>foreach (var num in evens)<br>Console.Write(" " + num);<br>Console.WriteLine("\n");<br></code></p>
<p class=signature>朱宇<br>2007.7.3 Revised</p>
</div>
 <img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/803981.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42944/" target="_blank">[新闻]十年祭:昔日明星软件今何在?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>LINQ How do I系列</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/22/793616.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Fri, 22 Jun 2007 14:27:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/22/793616.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/793616.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/22/793616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/793616.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/793616.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p><a href="http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/803981.html">Linq How do I #1</a>&nbsp;&nbsp;&nbsp;&nbsp;代码：<a href="http://www.cnblogs.com/Files/KENNETHBYRON/LINQHowDoI1.rar">HowdoI1</a><br><a href="http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804008.html">Linq How do I #2</a>&nbsp;&nbsp;&nbsp;&nbsp;代码：<a href="http://www.cnblogs.com/Files/KENNETHBYRON/LINQHowDoI2.rar">HowdoI2</a><br><a href="http://www.cnblogs.com/KENNETHBYRON/archive/2007/07/03/804021.html">Linq How do I #3</a>&nbsp;&nbsp;&nbsp;&nbsp;代码：<a href="http://www.cnblogs.com/Files/KENNETHBYRON/LINQHowDoI3.rar">HowdoI3</a><br></p>
</div>
 <img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/793616.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42943/" target="_blank">[新闻]六大可能出售IT企业名单：SUN领头或被猎走</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>有关LINQ教程的说明</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/21/792397.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Thu, 21 Jun 2007 14:43:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/21/792397.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/792397.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/21/792397.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/792397.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/792397.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p>我的LINQ教程分为三个系列(暂定)<br>1.How do I系列 : 由浅入深地通过实例逐步讲解LINQ语言和LINQ框架<br>2.In Depth系列 : 配合How do I系列深入讲解每节How do I代码背后的'内幕'<br>3.Task Drivern系列 : 通过DEMO讲解朋友们发给我的典型LINQ和LINQ Framework问题<br>4.WebCast系列 : 翻译英文WebCast课程内容及代码实现<br></p>
<p class=signature>朱宇<br>2007.6.21</p>
</div><img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/792397.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42942/" target="_blank">[新闻]Linux内核2.6.27正式到来</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>有关LINQ说法上的勘误</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/21/792378.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Thu, 21 Jun 2007 14:32:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/21/792378.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/792378.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/21/792378.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/792378.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/792378.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">近来跟很多朋友谈到过</span><span lang=EN-US style="FONT-SIZE: 9pt">.NET Framework 3.5</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的新特性</span><span lang=EN-US style="FONT-SIZE: 9pt">,</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中间不乏很多让我非常迷惑的说法</span><span lang=EN-US style="FONT-SIZE: 9pt">.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然碍于面子问题不好在别人面前纠正他们的说法</span><span lang=EN-US style="FONT-SIZE: 9pt">.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以写出来希望大家不要将这些概念混淆在一起</span><span lang=EN-US style="FONT-SIZE: 9pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天就先说说</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">吧</span><span lang=EN-US style="FONT-SIZE: 9pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">LINQ-LINQ Framework-LINQ Project<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常我能从别人口中听到的</span><span lang=EN-US style="FONT-SIZE: 9pt">99%</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都是</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无论什么东西</span><span lang=EN-US style="FONT-SIZE: 9pt">,</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一路</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到底</span><span lang=EN-US style="FONT-SIZE: 9pt">.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其实不然</span><span lang=EN-US style="FONT-SIZE: 9pt">,LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并没有你们说的那么强大</span><span lang=EN-US style="FONT-SIZE: 9pt">,LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只是一种查询语言就象</span><span lang=EN-US style="FONT-SIZE: 9pt">T-SQL,HQL,</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只不过这种查询语言被</span><span lang=EN-US style="FONT-SIZE: 9pt">.NET</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集成到</span><span lang=EN-US style="FONT-SIZE: 9pt">C#3.0</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US style="FONT-SIZE: 9pt">VB9.0</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等语言中了</span><span lang=EN-US style="FONT-SIZE: 9pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而平时大家说的更多的</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是指</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ Framework. LINQ Framework(LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架</span><span lang=EN-US style="FONT-SIZE: 9pt">)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang=EN-US style="FONT-SIZE: 9pt">ADO.NET</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个子集</span><span lang=EN-US style="FONT-SIZE: 9pt">.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架主要是为</span><span lang=EN-US style="FONT-SIZE: 9pt">.NET</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台提供</span><span lang=EN-US style="FONT-SIZE: 9pt">ORM</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">机制</span><span lang=EN-US style="FONT-SIZE: 9pt">.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说得再明白一点</span><span lang=EN-US style="FONT-SIZE: 9pt">.LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架的功能主要有以下两个方面</span><span lang=EN-US style="FONT-SIZE: 9pt">:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="FONT-SIZE: 9pt; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang=EN-US style="FONT-SIZE: 9pt">.NET Framework 3.5</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言类库</span><span lang=EN-US style="FONT-SIZE: 9pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="FONT-SIZE: 9pt; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang=EN-US style="FONT-SIZE: 9pt">.NET Framework 3.5</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供</span><span lang=EN-US style="FONT-SIZE: 9pt">ORM</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">机制框架</span><span lang=EN-US style="FONT-SIZE: 9pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而所有有关</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ. LINQ Framework</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的支持都来自微软的</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ Project,</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即</span><span lang=EN-US style="FONT-SIZE: 9pt">LINQ</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">项目</span><span lang=EN-US style="FONT-SIZE: 9pt">.<br><o:p></o:p></span></p>
<p>续<br># 回复 : deerchao<br>DLINQ是LINQ Framework中的一个代号.DLINQ隶属于LINQ Framework中的LINQ to SQL.代表LINQ对SQL的集成.<br>.NET语言集成查询可用于查询关系数据存储,而不必离开本地编程语言的语法或编译时环境.该工具代号为DLinq,它利用SQL架构信息到CLR元数据的集成.该集成将SQL表和视图定义编译为可以从任何语言访问的CLR类型.DLinq定义了两个核心属性([Table]和[Column]),它们指示哪些CLR类型和属性对应于外部SQL数据.[Table]属性可以应用于类,并将CLR类型与命名的SQL表或视图相关联.[Column]属性可以应用于任何字段或属性,并将成员与命名的SQL列相关联.这两个属性均被参数化,以允许保留特定于SQL的元数据. </p>
<p class=signature>朱宇<br>2007.6.21</p>
</div>
<img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/792378.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42942/" target="_blank">[新闻]Linux内核2.6.27正式到来</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>终于又回来了</title><link>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/20/790806.html</link><dc:creator>Kenneth Byron</dc:creator><author>Kenneth Byron</author><pubDate>Wed, 20 Jun 2007 10:09:00 GMT</pubDate><guid>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/20/790806.html</guid><wfw:comment>http://www.cnblogs.com/KENNETHBYRON/comments/790806.html</wfw:comment><comments>http://www.cnblogs.com/KENNETHBYRON/archive/2007/06/20/790806.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/KENNETHBYRON/comments/commentRss/790806.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/KENNETHBYRON/services/trackbacks/790806.html</trackback:ping><description><![CDATA[<div id=mytextdiv>
<p>&nbsp;&nbsp;&nbsp;先扯点闲的.好久没有回来CNBLOGS了.一直在忙.工作压力还真不小.培训更是让我头疼.不过现在终于熬过来了. <br>&nbsp;&nbsp;&nbsp;不知道搞什么飞机.我的本本一直都是只能浏览.却不能登陆博客园.一气之下把他废了.呵呵.给我弟弟上学学习用了.索性给自己奢侈一把.搞个新的.呵呵.<br>&nbsp;&nbsp;&nbsp;新本本的第一个系统就是Windows Server Code Name Longhorn Beta 3.也就是未来的Windows Server 2008第三测试版本.感觉不错.而且使用的是熟悉的NTFS.而不是WinFS.这个是我开心的.呵呵.因为一直被Vista的WinFS搞得很惨.好象说废话说多了.呵呵.言归正传吧.目前我使用的开发平台是Visual Studio Code Name Orcas Beta 1.也就是未来的VS2008.相信大家都在期待它的发布吧.大概今年年底吧.我和大家一样在期待这一天的到来.<br>&nbsp;&nbsp;&nbsp;又扯远了.在VS Orcas中.集成了.NetFX 2.0, .NetFX3.0和.Net3.5Beta1的版本.<br>&nbsp;&nbsp;&nbsp;说到.NetFX3.5.就一定要说起几点重要的更新.C#3.0.LINQ.ADO.NET LINQ Framework都是令我兴奋不已的.正好很多朋友问起我是否考虑过NHibernate和LINQ Framework哪个更出色一点.我还真不知道怎么回答.可能现在还是NHibernate更普及一些.不过我还是坚持在使用LINQ和LINQ Framework.<br>&nbsp;&nbsp;&nbsp;兴奋不已中.时隔10个月.我又回到了CNBLOGS.<br>&nbsp;&nbsp;&nbsp;那么好了.这里问候一下我的好朋友们.Tony.老赵.雨声.等等吧.哦.还有苏鹏.许久没见.你感冒好了吧?呵呵.<br>&nbsp;&nbsp;&nbsp;最后说一下暂时的想法吧.<br>&nbsp;&nbsp;&nbsp;虽然LINQ项目已经有一岁左右了.可是国人的资料还比较少.我身边的人.还有我的朋友们都还不太清楚LINQ和ADO.NET LINQ Framework的详情.所以我会花一些时间为大家准备些LINQ的资料.那么我想我们还是由浅入深,从How do I开始吧.再接下来的一段时间里.我会每天为大家准备一个5分钟的How do I.<br>&nbsp;&nbsp;&nbsp;如果其他的朋友们有ASP.NET.ASP.NET AJAX.LINQ.LINQ Framework.以及ORM方面的问题.可以Email我.我的地址是kennethbyron@gmail.com.
<p>
<p style="TEXT-ALIGN: right">朱宇<br>2007.6.20</p>
</div><img src ="http://www.cnblogs.com/KENNETHBYRON/aggbug/790806.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42941/" target="_blank">[新闻]《星际争霸2》一分为三 各种族依次登场</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>