Hello World
Spiga

觉得有必要来澄清几组重要概念

2008-06-04 01:51 by 老赵, 33111 visits

承蒙大家厚爱,不少朋友都会把遇到的问题向老赵进行讯问。不过在阅读很多朋友问题的过程中,以及平时和别人讨论中,亦或是园子里的文章中经常发现一些误用概念的情况。如果在概念上没有形成共识,那么在工作和交流上就会造成许多问题。因此,虽然老赵已经在其他一些地方(例如WebCast或一些文章的评论)做过解释,但是现在仍然觉得有必要特地来澄清一些概念,解释一下这些概念之间的区别和联系。希望在明确这些概念之后,大家能够把注意力集中在对于具体问题的分析解决上,而不要让沟通成为瓶颈。

在这篇文章中,我希望澄清三组概念,它们是:

  • AJAX / AJAX框架 / AJAX.NET (Professional) / ASP.NET AJAX
  • LINQ / LINQ to SQL / LINQ to XXX
  • Lambda Expression / Expression Tree / 匿名方法

AJAX / AJAX框架 / AJAX.NET (Professional) / ASP.NET AJAX

这是我见过的混淆最多的一组概念。不过当去年AJAX技术如火如荼,AJAX框架层出不穷,而微软又推出ASP.NET AJAX框架之后,这四个概念之间的混淆也愈发严重起来了。我经常能看到这样的问题:

  • 我在用AJAX技术时不知道怎么在UpdatePanel里……
  • 我用AJAX.NET框架调用Web Service时……

这是非常典型的概念混淆,上面两句话的AJAX与AJAX.NET都应该使用ASP.NET AJAX替换。关于这几个概念的区别我《深入浅出ASP.NET AJAX》系列WebCast多次进行解释,不过收效似乎并不明显。于是我打算在这里再进行一下说明:

AJAX是Asynchronous JavaScript and XML缩写。这个概念代表的是一种技术,当您在说“我在项目中使用了AJAX技术时”,只是代表了您使用客户端XMLHttpRequest对象与服务器端进行异步通信。不过因为随着AJAX技术的运用往往会带来丰富的客户端效果,因此对AJAX技术的广义理解也可以认为这是一种操作客户端DOM而带来丰富效果的技术(这个“广义”的描述其实并不准确,大家明白老赵的意思就可以了)。

AJAX框架是一套辅助开发人员使用AJAX技术的代码包(库,etc.)。一个AJAX框架的目的一般是对XMLHttpRequest对象的使用进行封装,并提供一些操作DOM元素或者实现特殊效果的“捷径”。成熟的AJAX框架有很多,它们可以被分为“以客户端为中心”和“面向特定服务器技术”两大类。前者的优秀代表有(排名不分先后):PrototypejQueryMootoolsYUIDojo等等(最后两个其实更接近一套客户端界面库,也就是“广义”的AJAX框架);而后者的典型代表既是AJAX.NET和ASP.NET AJAX了——当然,也有优秀的AJAX框架面向其他服务器技术,在此不提。

AJAX.NET (Professional)是ASP.NET平台上著名的AJAX框架,诞生于2005年2月(虽然正式命名为AJAX.NET则是在两个月之后),作者为Michael Schwarz。同年10月,Michael为AJAX.NET提供了更丰富的功能(主要是安全性方面),并将其改名为AJAX.NET Professional。AJAX.NET提供的最主要的(也是唯一)的功能就是异步调用服务器端方法,可谓非常纯粹的“基于数据”的AJAX使用方式。这个框架是一个个人作品,有支持.NET 1.1和2.0的版本,它并不属于微软官方,目前已经停止更新。

ASP.NET AJAX的Code Name为“Atlas”,在CTP向Beta版转移时曾经发生过翻天覆地的变化。ASP.NET AJAX中包含了UpdatePanel等控件,可以非常透明地为现有的ASP.NET WebForms应用程序添加AJAX效果。此外还提供了客户端异步调用Web Services的方法,使开发人员也能够使用面向数据的方式使用AJAX技术。值得一提的是ASP.NET AJAX的“附属品”相当丰富。例如ASP.NET AJAX名为“Microsoft AJAX Library”的客户端部分是一个纯客户端AJAX框架,提供了面向对象类型系统、浏览器兼容层、异步通信层等多种基础组件;ASP.NET AJAX的开源扩展包“AJAX Control Toolkit”包含了数十个可以直接使用的AJAX服务器端控件,这样开发人员能够轻松地添加丰富的客户端效果。同时,官方还为ASP.NET AJAX提供了“非正式”地扩展包,其中的History等优秀控件也将加入未来版本的ASP.NET AJAX框架中。ASP.NET AJAX是官方出品的AJAX框架,目前已经被集成到ASP.NET 3.5中去了,因此其版本号也从ASP.NET AJAX 1.0一下子“跃升为”ASP.NET AJAX 3.5。如果您看到了这些版本号也请不要疑惑,其实ASP.NET AJAX 3.5相对于ASP.NET AJAX 1.0来说只是修补了一些细小bug,几乎没有任何变化。

LINQ / LINQ to SQL / LINQ to XXX

LINQ是新生事物,不过从不少文章和讨论上看来,这方面的概念也已经有点混沌不清了。因此我们经常可以看到这样的话:

  • LINQ只能将数据表与实体属性一一对应……
  • LINQ开发指南:在LINQ中进行数据库字段映射……

以上两句话其实说的都是LINQ to SQL而不是指LINQ。可能由于LINQ to SQL的上镜率最广(连MSDN上About LINQ的第一个示例就是查询数据库的),因此许多人都将LINQ to SQL与LINQ混用,这会给初学者造成误解,认为LINQ就是LINQ to SQL,LINQ to SQL就是LINQ——事实当然不是这样的。

LINQ是Language-Integrated Query的缩写,是C# 3.0和VB 9.0中新加入的语言特性,可以在编程时使用内置的查询语言进行基于集合的操作。这么做可以大大简化开发过程,提高开发效率。例如:

List<User> userList = GetUserList();
var userWithOddId = from u in userList
                    where u.UserID % 2 == 1
                    select u;
 
foreach (User u in userWithOddId)
{
    Console.WriteLine(u.UserName);
}

如果没有LINQ,要筛选出ID为奇数的User对象则需要创建一个List,然后遍历整个列表,将符合特定条件的User对象放入新列表。而有了LINQ,这部分的筛选就变得非常容易,甚至只需要一句话就能完成。如果觉得这个例子不够说明LINQ对生产力有重大贡献的话,请关注我接下来的一篇文章(暂定名为《我们为什么要拥抱LINQ》)。LINQ特指形如上面这段代码中from...where...select这样的用法,其返回值是IQueryable<T>或IEnumerable<T>。

LINQ to SQL是.NET 3.5内置的一个轻量级O/R Mapping解决方案,可以将数据表映射为实体对象,方便开发人员对数据库的操作。可见,LINQ to SQL实只是LINQ的一个实现,提供了一个可以查询SQL Server数据库的LINQ Provider。

LINQ Provider是LINQ查询的执行器,标准LINQ语法支持许多的操作符,但是某个具体的LINQ实现可能只支持其中的一部分。在.NET 3.5默认提供了三种LINQ Provider,分别是LINQ to Object(即上面的例子),LINQ to SQL以及LINQ to XML。

LINQ to XXX表示使用LINQ针对XXX这种数据进行查询的解决方案。我们可以自定义LINQ Provider,使用我们自定义的查询规则来处理特定数据集。目前互联网上已经可以找到数十种LINQ Provider(如LINQ to Flickr,LINQ to NHibernate等),而已经处于beta 3阶段的ADO.NET Entity Framework,最终也会提供一个LINQ Provider,叫做“LINQ to Entities”。

Lambda Expression / Expression Tree / 匿名方法

Lambda Expression从定义上讲是指带有“=>”符号的表达式,例如:

  • x => x + 1
  • (x, y) => x > y
  • () => 5
  • (x, y) => { return x > y; }

Lambda Expreesion本身并不会在概念上引起混淆,不过由于在C# 3.0中Lambda Expression有两种截然不同的使用方式,有些朋友就会产生疑问,究竟Lambda Expression是做什么用的?

Lambda Expression的一个重要作用就是提供一种使用匿名方法的新语法,在《您善于使用匿名函数吗?》一文中您可以看到这种使用方式。利用Lambda Expression表示匿名函数的一个重要的缺点就是无法使用带out或ref关键字的参数,不过它比使用delegate关键字的表示法略为简单一点,因为无需提供参数类型,例如:

public static bool CallMethod(Func<int, bool> method)
{
    return method(0);
}
 
static void Main(string[] args)
{
    CallMethod(delegate(int a) { return false; });
    CallMethod(a => { return false; });
}

可见,使用Lambda Expression表示的匿名方法无需指定参数类型,因为这一切都已经交给编译器来判断了。这一点在参数类型长而复杂的情况下(例如并行库中的方法)非常重要。因此现在要不是会涉及到out/ref参数,我都会使用Lambda Expression来表示匿名方法。

Lambda Expression的另一个作用自然就是构造一个LambdaExpression对象。任意一个Expression对象都表示了一个Expression Tree的根节点,而开发人员可以通过解析这个Expression Tree来实现特定的功能。我们编写的方法可以接受一个Lambda Expression作为参数,但是我们还必须对这个参数的形式进行限制,这个参数才能有意义。这时候我们就会使用Expression<TDelegate>类型作为方法的参数类型,这样在使用这个方法时就必须使用满足TDelegate的签名及返回值的Lambda Expression才能编译通过。例如:

public static void CallMethod(Expression<Func<int, bool>> prediect) { ... }
 
static void Main(string[] args)
{
    CallMethod(a => a > 0);
}

解析一个Expression Tree并不是一件简单的事情,一定程度上这相当于在进行编译工作,只是最终生成的结果不是机器码或IL,而是一个执行结果,并且语法解析的过程已经由C#编译器帮我们完成了。我在《扩展LINQ to SQL:使用Lambda Expression批量删除数据》一文中曾经提到过这一点,并且给出了一个实例,感兴趣的朋友们可以参考一下。

需要注意的是,如果在构造一个Expression对象时,Lambda Expression的Body部分不能是Statement;而在表示一个匿名对象时Lambda Expression的Body既可以是Expression也可以是Statement。无论是使用Expression还是Statement作为Body,只要表示的含义相同,编译器都会生成一样的匿名函数。例如以下两种写法其实是等价的:

  • (x, y) => x > y
  • (x, y) => { return (x > y); }

 

最后,我留给大家一个问题:以下两个做法的结果是相同的,而代码也非常接近。不过它们其实有着非常大的区别,您能指出吗?

var intList = new List<int>() { 1, 2, 3, 4, 5 };
foreach (int i in intList.Where(i => i % 2 == 1))
{
    Console.WriteLine(i);
}
var intList = new List<int>() { 1, 2, 3, 4, 5 }.AsQueryable();
foreach (int i in intList.Where(i => i % 2 == 1))
{
    Console.WriteLine(i);
}
Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

122 条回复

  1. 老赵
    admin
    链接

    老赵 2008-06-03 17:52:00

    才思枯竭了,写得文章读上去真不顺畅……

  2. 小Q
    *.*.*.*
    链接

    小Q 2008-06-03 17:57:00

    hehe !

  3. 飄lá┽蕩去
    *.*.*.*
    链接

    飄lá┽蕩去 2008-06-03 18:05:00

    理清了很多概念

  4. roCltA[未注册用户]
    *.*.*.*
    链接

    roCltA[未注册用户] 2008-06-03 18:20:00

    很好文,经典,有质感,有水平,大哥收我做入室弟子吧

  5. 深蓝
    *.*.*.*
    链接

    深蓝 2008-06-03 18:22:00

    才思枯竭了都写的那么好。那文思如泉涌的时候还得了?

  6. Duron800[未注册用户]
    *.*.*.*
    链接

    Duron800[未注册用户] 2008-06-03 18:23:00

    进来学习学习。

  7. Ryan Gene
    *.*.*.*
    链接

    Ryan Gene 2008-06-03 18:36:00

    这篇文章对于初学者来说应该是可以受益非浅的,写得非常好:)

  8. <∩扫地僧∩>
    *.*.*.*
    链接

    <∩扫地僧∩> 2008-06-03 18:39:00

    写得很好!

  9. 金色海洋(jyk)
    *.*.*.*
    链接

    金色海洋(jyk) 2008-06-03 18:42:00

    收藏,以后用。

  10. 张中健
    *.*.*.*
    链接

    张中健 2008-06-03 19:00:00

    Expression Tree 是做什么的。有其他相似的东西吗

  11. 火无极
    *.*.*.*
    链接

    火无极 2008-06-03 20:07:00

    老赵就是强大!学习

  12. 皇帝的新装
    *.*.*.*
    链接

    皇帝的新装 2008-06-03 20:30:00

  13. Meazza-mFrog
    *.*.*.*
    链接

    Meazza-mFrog 2008-06-03 20:32:00

    思路清晰很多。学习了

  14. Allen Lee
    *.*.*.*
    链接

    Allen Lee 2008-06-03 20:33:00

    最后两个代码的区别是:第一个代码的Where里的Lambda表达式会被翻译成IL,而第二个代码的Where里的Lambda表达式则被翻译成表达式树。:)

  15. turingbook
    *.*.*.*
    链接

    turingbook 2008-06-03 20:49:00

    写得很好,受益匪浅啊!

  16. 秋千
    *.*.*.*
    链接

    秋千 2008-06-03 20:50:00


    第一个:直接是一个数组。
    第二个是:{System.Collections.Generic.List`1[System.Int32]}
    Results View 是一个数组。
    只是不明白:{System.Collections.Generic.List`1[System.Int32]}
    表示什么意思?

  17. 退尽浮华,尽显本色
    *.*.*.*
    链接

    退尽浮华,尽显本色 2008-06-03 21:02:00

    老赵:
    有个实际的问题想问一下,
    单纯的在.net项目的开发中,使用ajax与使用atlas他们各自的优势体现在哪里?
    本人认为atlas更方便,对后期的维护和代码的调试相对容易一些(在atlas本身没有bug的情况下),而ajax冗长的代码,在后期维护中将带来很大的麻烦。所以我觉得在绝大部分项目中还是用atlas来开发比较好。
    不知道老赵怎么认为,请指教。

  18. tonyc[未注册用户]
    *.*.*.*
    链接

    tonyc[未注册用户] 2008-06-03 21:18:00

    @退尽浮华,尽显本色
    实现页面ajax的js核心代码其实就那么几句,冗长是因为要实现其他的功能和效果,atlas就是ajax的一个.net的框架,提供快速开发。

    @Jeffrey Zhao
    还有dlinq呢?那个和一堆linq有什么区别呢?

  19. WCF群组博客
    *.*.*.*
    链接

    WCF群组博客 2008-06-03 21:26:00

    呵呵

  20. James-yu
    *.*.*.*
    链接

    James-yu 2008-06-03 21:36:00

    偶滴个神呀,最后一段怎么觉得是那种茴字有几种写法的感觉

    软件是什么,软件开发为什么, 看得越多越糊涂了

  21. 老赵
    admin
    链接

    老赵 2008-06-03 21:40:00

    --引用--------------------------------------------------
    秋千:
    第一个:直接是一个数组。
    第二个是:{System.Collections.Generic.List`1[System.Int32]}
    Results View 是一个数组。
    只是不明白:{System.Collections.Generic.List`1[System.Int32]}
    表示什么意思?
    --------------------------------------------------------
    这个不对,呵呵。

  22. 老赵
    admin
    链接

    老赵 2008-06-03 21:40:00

    --引用--------------------------------------------------
    Allen Lee: 最后两个代码的区别是:第一个代码的Where里的Lambda表达式会被翻译成IL,而第二个代码的Where里的Lambda表达式则被翻译成表达式树。:)
    --------------------------------------------------------
    其实Expression Tree也是IL了吧……我不清楚。

  23. 老赵
    admin
    链接

    老赵 2008-06-03 21:42:00

    --引用--------------------------------------------------
    退尽浮华,尽显本色: 老赵:
    有个实际的问题想问一下,
    单纯的在.net项目的开发中,使用ajax与使用atlas他们各自的优势体现在哪里?
    本人认为atlas更方便,对后期的维护和代码的调试相对容易一些(在atlas本身没有bug的情况下),而ajax冗长的代码,在后期维护中将带来很大的麻烦。所以我觉得在绝大部分项目中还是用atlas来开发比较好。
    不知道老赵怎么认为,请指教。
    --------------------------------------------------------
    我相当的晕啊……我这篇文章本来就是概念澄清贴,结果……
    您能否按照我文章中给出的概念,重新问一次呢?

  24. 老赵
    admin
    链接

    老赵 2008-06-03 21:45:00

    --引用--------------------------------------------------
    @Jeffrey Zhao
    还有dlinq呢?那个和一堆linq有什么区别呢?
    --------------------------------------------------------
    搜索了一些资料,dling就是linq to sql吧

  25. 老赵
    admin
    链接

    老赵 2008-06-03 21:46:00

    --引用--------------------------------------------------
    James-yu: 偶滴个神呀,最后一段怎么觉得是那种茴字有几种写法的感觉

    软件是什么,软件开发为什么, 看得越多越糊涂了
    --------------------------------------------------------
    达到一个目的有多种做法是正常的,只是越来越容易而已。软件开发的发展,其目的就是提高生产力,C#语言的发展无不遵循这一点。

  26. Justin
    *.*.*.*
    链接

    Justin 2008-06-03 21:47:00

    up&mark

  27. Gray Zhang
    *.*.*.*
    链接

    Gray Zhang 2008-06-03 21:47:00

    @秋千
    {System.Collections.Generic.List`1[System.Int32]}
    这个说明他的类型是System.Collections.Generic.List那个带1个类型参数的类,其类型参数是Int32,仅此而已……

  28. Gray Zhang
    *.*.*.*
    链接

    Gray Zhang 2008-06-03 21:48:00

    @tonyc
    DLINQ就是LINQ TO SQL,另外还有XLINQ就是LINQ TO XML
    但是我记得当初听MS的演示的时候,还有个LINQ TO DATASET,现在怎么不见了

  29. Allen Lee
    *.*.*.*
    链接

    Allen Lee 2008-06-03 21:56:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    Allen Lee: 最后两个代码的区别是:第一个代码的Where里的Lambda表达式会被翻译成IL,而第二个代码的Where里的Lambda表达式则被翻译成表达式树。:)
    --------------------------------------------------------
    其实Expression Tree也是IL了吧……我不清楚。
    --------------------------------------------------------
    不好意思,表达问题,更确切的说法是,第一个代码的Where里的Lambda表达式会被编译成*可直接执行的代码*,而第二个代码的Where里的Lambda表达式则会被编译器进行词法分析,然后用表达式树这种数据结构储存*分析结果*。

  30. 辉郎
    *.*.*.*
    链接

    辉郎 2008-06-03 22:02:00

    最后还留个问题,Lambda表达式不甚熟悉~~

  31. PCJIM
    *.*.*.*
    链接

    PCJIM 2008-06-03 22:08:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    James-yu: 偶滴个神呀,最后一段怎么觉得是那种茴字有几种写法的感觉

    软件是什么,软件开发为什么, 看得越多越糊涂了
    --------------------------------------------------------
    达到一个目的有多种做法是正常的,只是越来越容易而已。软件开发的发展,其目的就是提高生产力,C#语言的发展无不遵循这一点。
    --------------------------------------------------------

    “软件开发的发展,其目的就是提高生产力”,这句话说得太好了,赞一个!

  32. 退尽浮华,尽显本色
    *.*.*.*
    链接

    退尽浮华,尽显本色 2008-06-03 22:08:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    退尽浮华,尽显本色: 老赵:
    有个实际的问题想问一下,
    单纯的在.net项目的开发中,使用ajax与使用atlas他们各自的优势体现在哪里?
    本人认为atlas更方便,对后期的维护和代码的调试相对容易一些(在atlas本身没有bug的情况下),而ajax冗长的代码,在后期维护中将带来很大的麻烦。所以我觉得在绝大部分项目中还是用atlas来开发比较好。
    不知道老赵怎么认为,请指教。
    --------------------------------------------------------
    我相当的晕啊……我这篇文章本来就是概念澄清贴,结果……
    您能否按照我文章中给出的概念,重新问一次呢?
    --------------------------------------------------------
    又认真的读了一遍,应该没有说错啊。
    一个是在.net中使用atlas技术,一个是在.net中使用ajax技术。

  33. 老赵
    admin
    链接

    老赵 2008-06-03 22:16:00

    --引用--------------------------------------------------
    不好意思,表达问题,更确切的说法是,第一个代码的Where里的Lambda表达式会被编译成*可直接执行的代码*,而第二个代码的Where里的Lambda表达式则会被编译器进行词法分析,然后用表达式树这种数据结构储存*分析结果*。
    --------------------------------------------------------
    还是不懂啊,其实第一个是匿名函数表示法,第二个是Expression Tree表示罚……被你一说就很复杂的样子,呵呵。

  34. dusonchen[未注册用户]
    *.*.*.*
    链接

    dusonchen[未注册用户] 2008-06-03 22:20:00

    文字大了点,看得不舒服.

  35. 老赵
    admin
    链接

    老赵 2008-06-03 22:20:00

    --引用--------------------------------------------------
    又认真的读了一遍,应该没有说错啊。
    一个是在.net中使用atlas技术,一个是在.net中使用ajax技术。
    --------------------------------------------------------
    AJAX是指一种技术,就算用了Atlas(最好说成ASP.NET AJAX)框架也还是在用AJAX技术阿。
    其实如果要用AJAX技术的话,总归要依托某一个AJAX框架比较好,至于是否是ASP.NET AJAX其实不强求……

  36. 老赵
    admin
    链接

    老赵 2008-06-03 22:22:00

    --引用--------------------------------------------------
    dusonchen: 文字大了点,看得不舒服.
    --------------------------------------------------------
    大吗?其实和全站大部分字体是一样大小的阿,呵呵。

  37. 王孟军!
    *.*.*.*
    链接

    王孟军! 2008-06-03 22:23:00

    老赵你好
    一直偷偷的看你的文章,却很少回帖,实在是不太地道^-^
    我最近一直 在学习研究Asp.net服务器控件,我想先把服务器控件做精,
    然后,开始向ajax技术发展,你觉得呢?

    还有,听说Asp.net mvc 框架 遗弃了Form,还有服务器控件,真的吗?
    那Asp.net mvc怎样来维护状态?

    WPFE这玩意,和ASP.NET是相互相成,还是此消彼涨?
    wmj2212@126.com这是我 的MSN,请加我,谢谢了
    还有,这是我 的BLOGS http://wmj.cnblogs.com/,呵呵
    王孟军


  38. 老赵
    admin
    链接

    老赵 2008-06-03 22:23:00

    --引用--------------------------------------------------
    辉郎: 最后还留个问题,Lambda表达式不甚熟悉~~
    --------------------------------------------------------
    哪方面不熟悉呢?

  39. James-yu
    *.*.*.*
    链接

    James-yu 2008-06-03 22:35:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    PCJIM: --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    James-yu: 偶滴个神呀,最后一段怎么觉得是那种茴字有几种写法的感觉

    软件是什么,软件开发为什么, 看得越多越糊涂了
    --------------------------------------------------------
    达到一个目的有多种做法是正常的,只是越来越容易而已。软件开发的发展,其目的就是提高生产力,C#语言的发展无不遵循这一点。
    --------------------------------------------------------

    “软件开发的发展,其目的就是提高生产力”,这句话说得太好了,赞一个!
    --------------------------------------------------------

    我知道这句话说的很好,问题是真的提高了生产力吗? 微软提供了这么多的新技术,它自己在用吗? 比较孤陋寡闻,不知道那个知名软件是用了这么多的技巧。

    一个朋友,很懂实际业务,本来可以简单的实现一个系统,但是他拘泥于“技术”、“完美框架”,耽误了许多时间。

    大家都在开发多大规模的应用? 使用了那么多的“技术”,难道就没有学习成本(包括下次重用的时候)、维护成本?

    迷茫中....

  40. Q.Lee.lulu
    *.*.*.*
    链接

    Q.Lee.lulu 2008-06-03 23:10:00

    学习下
    问题不懂!!

  41. 秋千
    *.*.*.*
    链接

    秋千 2008-06-03 23:12:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    秋千:
    第一个:直接是一个数组。
    第二个是:{System.Collections.Generic.List`1[System.Int32]}
    Results View 是一个数组。
    只是不明白:{System.Collections.Generic.List`1[System.Int32]}
    表示什么意思?
    --------------------------------------------------------
    这个不对,呵呵。
    --------------------------------------------------------
    不对?是不是第一个是集合?第二个是个类对象?望详解

  42. 秋千
    *.*.*.*
    链接

    秋千 2008-06-03 23:13:00

    --引用--------------------------------------------------
    Gray Zhang: @秋千
    {System.Collections.Generic.List`1[System.Int32]}
    这个说明他的类型是System.Collections.Generic.List那个带1个类型参数的类,其类型参数是Int32,仅此而已……
    --------------------------------------------------------
    大哥能说的详细些吗?

  43. 老赵
    admin
    链接

    老赵 2008-06-03 23:35:00

    --引用--------------------------------------------------
    王孟军!: 老赵你好
    一直偷偷的看你的文章,却很少回帖,实在是不太地道^-^
    我最近一直 在学习研究Asp.net服务器控件,我想先把服务器控件做精,
    然后,开始向ajax技术发展,你觉得呢?

    还有,听说Asp.net mvc 框架 遗弃了Form,还有服务器控件,真的吗?
    那Asp.net mvc怎样来维护状态?

    WPFE这玩意,和ASP.NET是相互相成,还是此消彼涨?
    wmj2212@126.com这是我 的MSN,请加我,谢谢了
    还有,这是我 的BLOGS http://wmj.cnblogs.com/,呵呵
    --------------------------------------------------------
    asp.net mvc没有状态维护,就是普通web开发技术。
    其实服务器控件和ajax的区别还是比较大的,并没有太大关系,呵呵。
    silverlight和asp.net就像flash和asp.net,相辅相成。

  44. 老赵
    admin
    链接

    老赵 2008-06-03 23:38:00

    --引用--------------------------------------------------
    不对?是不是第一个是集合?第二个是个类对象?望详解
    --------------------------------------------------------
    我在上面已经回答过了,过几天我具体写一下。

  45. 老赵
    admin
    链接

    老赵 2008-06-03 23:38:00

    --引用--------------------------------------------------
    @Jeffrey Zhao
    我知道这句话说的很好,问题是真的提高了生产力吗? 微软提供了这么多的新技术,它自己在用吗? 比较孤陋寡闻,不知道那个知名软件是用了这么多的技巧。

    一个朋友,很懂实际业务,本来可以简单的实现一个系统,但是他拘泥于“技术”、“完美框架”,耽误了许多时间。

    大家都在开发多大规模的应用? 使用了那么多的“技术”,难道就没有学习成本(包括下次重用的时候)、维护成本?

    迷茫中....
    --------------------------------------------------------
    自然提高了,我下面一片文章就会说说C#的一些特性如何提高开发效率。而且你说的框架云云,可能会淘汰,但是C#语言,以及一些基础改进,可都是实打实的东西,开发效率提高无比多。
    没有什么可以迷茫的,这些东西都是相通的,把握住一个,其他大都不困难,呵呵。

  46. Cat Chen
    *.*.*.*
    链接

    Cat Chen 2008-06-03 23:53:00

    在AsQueryable()之后,Where()操作由实现IQueryable的类来决定如何处理Expression Tree,例如Linq to Sql会将它翻译为SQL,而一般的IEnumerable只会做简单的遍历。

  47. Anytao
    *.*.*.*
    链接

    Anytao 2008-06-04 00:51:00

    直接的看,第一种方式匹配Enumerable的Where扩展方法,而第二种方式匹配Queryable的Where扩展方法,一个是Anonymous Method,一个是Expression Tree

  48. 晓风残月
    *.*.*.*
    链接

    晓风残月 2008-06-04 01:23:00

    --引用--------------------------------------------------
    退尽浮华,尽显本色: --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    退尽浮华,尽显本色: 老赵:
    有个实际的问题想问一下,
    单纯的在.net项目的开发中,使用ajax与使用atlas他们各自的优势体现在哪里?
    本人认为atlas更方便,对后期的维护和代码的调试相对容易一些(在atlas本身没有bug的情况下),而ajax冗长的代码,在后期维护中将带来很大的麻烦。所以我觉得在绝大部分项目中还是用atlas来开发比较好。
    不知道老赵怎么认为,请指教。
    --------------------------------------------------------
    我相当的晕啊……我这篇文章本来就是概念澄清贴,结果……
    您能否按照我文章中给出的概念,重新问一次呢?
    --------------------------------------------------------
    又认真的读了一遍,应该没有说错啊。
    一个是在.net中使用atlas技术,一个是在.net中使用ajax技术。
    --------------------------------------------------------
    我想老赵要哭了....

    “在.net中使用atlas技术”其实就是“在.net中使用ajax技术”
    记住了 atlas 就是 ASP.NET AJAX(Microsoft official)框架,atlas 是其 code name, 那如何理解你这里出现的 ajax 技术指代什么?
    我猜想是 AJAX PRO 框架? 但是 AJAX Pro 的代码比 atlas 冗长吗?
    atlas 建立原有 asp.net 基础上,一个 updatepanel就完成了与原有 asp.net 服务器控件的无缝结合,具有丰富的 UI 功能,
    而 AJAX Pro 是一个清量级的 framework,本质上来说它封装了 xmlhttp 与服务端交互逻辑,没有UI功能比如列表数据你得自己画table出来,但是它的效率很高。
    如果你需要丰富的UI,或者对原有ASP.NET进行移植,那么 atlas 当然是不二选择,如果你要的是纯应用型的框架,比如在后台秘密传输数据,那么 AJAX Pro 的 json 效率是很高。

  49. 老赵
    admin
    链接

    老赵 2008-06-04 01:47:00

    --引用--------------------------------------------------
    Anytao: 直接的看,第一种方式匹配Enumerable的Where扩展方法,而第二种方式匹配Queryable的Where扩展方法,一个是Anonymous Method,一个是Expression Tree
    --------------------------------------------------------
    说的好啊,呵呵。

  50. 真见
    *.*.*.*
    链接

    真见 2008-06-04 03:37:00

    很好,学习了。。赵哥

  51. 真见
    *.*.*.*
    链接

    真见 2008-06-04 03:37:00

    不错。

  52. sunyan[未注册用户]
    *.*.*.*
    链接

    sunyan[未注册用户] 2008-06-04 08:56:00

    大脑积水

  53. Clingingboy
    *.*.*.*
    链接

    Clingingboy 2008-06-04 09:06:00

    恩,基本常识,人人需要了解

  54. Gray Zhang
    *.*.*.*
    链接

    Gray Zhang 2008-06-04 09:09:00

    @秋千
    其实就是说,int[]的AsQueryable()方法返回了一个List<int>

  55. 老赵
    admin
    链接

    老赵 2008-06-04 09:13:00

    --引用--------------------------------------------------
    Clingingboy: 恩,基本常识,人人需要了解
    --------------------------------------------------------
    不过有些牛人也会混淆……

  56. 老赵
    admin
    链接

    老赵 2008-06-04 09:13:00

    --引用--------------------------------------------------
    Gray Zhang: @秋千
    其实就是说,int[]的AsQueryable()方法返回了一个List&lt;int&gt;
    --------------------------------------------------------
    这个不对

  57. 老赵
    admin
    链接

    老赵 2008-06-04 09:14:00

    --引用--------------------------------------------------
    sunyan: 大脑积水
    --------------------------------------------------------
    不知还有救吗?

  58. 老赵
    admin
    链接

    老赵 2008-06-04 09:18:00

    --引用--------------------------------------------------
    “在.net中使用atlas技术”其实就是“在.net中使用ajax技术”
    --------------------------------------------------------
    按我理解,在.NET使用ajax技术只是说明用到了XMLHttpRequest技术而已,不说明用了任何框架。

  59. 小寒
    *.*.*.*
    链接

    小寒 2008-06-04 09:20:00

    仔细阅读了下整篇文章
    挺好
    我们在不断追求新的东西的时候,
    往往是一窝蜂的跟潮流
    真正理解其本质和细节的很少

  60. 狼Robot
    *.*.*.*
    链接

    狼Robot 2008-06-04 09:31:00

    学习

  61. 路过[未注册用户]
    *.*.*.*
    链接

    路过[未注册用户] 2008-06-04 09:37:00

    “DLINQ就是LINQ TO SQL,另外还有XLINQ就是LINQ TO XML
    但是我记得当初听MS的演示的时候,还有个LINQ TO DATASET 现在怎么不见了”

    Linq to DataSet 现在也有呀。

  62. 老赵
    admin
    链接

    老赵 2008-06-04 09:53:00

    --引用--------------------------------------------------
    路过: “DLINQ就是LINQ TO SQL,另外还有XLINQ就是LINQ TO XML
    但是我记得当初听MS的演示的时候,还有个LINQ TO DATASET 现在怎么不见了”
    Linq to DataSet 现在也有呀。
    --------------------------------------------------------
    LINQ to DataSet现在也有,不过我搜索了国外很多人的blog,的确DLinq和LINQ to SQL是一类东西……

  63. 阿福
    *.*.*.*
    链接

    阿福 2008-06-04 09:55:00

    很必要的文章,尤其是linq方面的概念,确实让初学者头大!
    这应该怪微软自己,很多命名不够明确,比如linq to sql 准确点应该是 linq to sql sever, 还有asp.net的linqdatasource控件准确的就应该是linqtosql(server)datasource嘛!
    而且同一概念前后会出现多个命名。。。

  64. 老赵
    admin
    链接

    老赵 2008-06-04 10:00:00

    @阿福
    linq to sql其实没有什么问题,我觉得……

  65. gongjunyan[未注册用户]
    *.*.*.*
    链接

    gongjunyan[未注册用户] 2008-06-04 10:06:00

    仔细揣摩,认真体会。。。。老赵的文章,一般从“老赵点滴”一直看到“提交”。。。o(∩_∩)o...

  66. 风海迷沙
    *.*.*.*
    链接

    风海迷沙 2008-06-04 10:18:00

    LINQ特指形如上面这段代码中from...where...select这样的用法,其返回值是IEnumerble<T>或IQueryable<T>。
    ----------
    返回值是什么类型可不一定哦~~

  67. 王德水
    *.*.*.*
    链接

    王德水 2008-06-04 10:39:00

    写的很好,比如学习Linq需要哪些知识? 顺序是什么样的?老赵能不能讲讲这些,我个人觉得传递学习经验比一篇技术文章更重要,授之以鱼,不如授之以渔。就像这篇文章一样,再次谢谢为我们带来好文章

  68. Yes!加菲猫
    *.*.*.*
    链接

    Yes!加菲猫 2008-06-04 11:16:00

    @Jeffrey Zhao
    感觉有些地方没讲完,好像我要吃鱼,结果送来的盘子里只有鱼头

  69. xingd
    *.*.*.*
    链接

    xingd 2008-06-04 11:23:00

    LINQ to Entity在.Net 3.5 SP1里提供。

    老赵最后的两个例子,第一个是用lambda生成匿名函数,调用Enumerable类中提供的IEnumerable的Where扩展方法,直接回调执行由编译器对lambda编译出来的函数。匿名函数是从代码的角度来看的,编译器会产出一个自动命名的IL函数。

    第二个是调用Queryable类中提供的IEnumerable的AsQueryable扩展方法,编译器会对lambda语名产生表达式树。

    其实IEnumerable.Where和IQueryable.Where的方法签名本来就不一样,一个是
    public static IQueryable<TSource> Where<TSource>(
    this IQueryable<TSource> source,
    Expression<Func<TSource, bool>> predicate
    )
    另一个是
    public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
    )

    对于我们自己定义的也是一样的,比如
    class test
    {
    static void foo(Func<int, bool> predicate)
    {}

    static void bar(Expression<Func<int, bool> predicate)
    {}

    static void Main(string[] args)
    {
    foo(x => x > 5);
    bar(x => x > 5);
    }
    }
    编译器对同样的lambda表达式 x => x > 5产生的结果就完全不一样,一个是自动命名的函数,一个是表达式树对象。

  70. 老赵
    admin
    链接

    老赵 2008-06-04 11:35:00

    --引用--------------------------------------------------
    返回值是什么类型可不一定哦~~
    --------------------------------------------------------
    返回类型其实只有IQueryable<T>

  71. 老赵
    admin
    链接

    老赵 2008-06-04 11:36:00

    --引用--------------------------------------------------
    Yes!加菲猫: @Jeffrey Zhao
    感觉有些地方没讲完,好像我要吃鱼,结果送来的盘子里只有鱼头
    --------------------------------------------------------
    哪些地方还不清楚呢?不过的确我会补充其它内容的,呵呵。

  72. 东哥
    *.*.*.*
    链接

    东哥 2008-06-04 11:55:00

    经常看老赵的文章,水平 有长进。

  73. 装配脑袋
    *.*.*.*
    链接

    装配脑袋 2008-06-04 11:56:00

    ExpressionTree是可以序列化传输的,因此最后一个问题方法二按ExpressionTree查询,是可以跨AppDomain进行的。而方法一按照匿名方法查询,只能在本地进行。

  74. 老赵
    admin
    链接

    老赵 2008-06-04 12:16:00

    --引用--------------------------------------------------
    装配脑袋: ExpressionTree是可以序列化传输的,因此最后一个问题方法二按ExpressionTree查询,是可以跨AppDomain进行的。而方法一按照匿名方法查询,只能在本地进行。
    --------------------------------------------------------
    那是因为ExpreesionTree是个普通类对象,而匿名方法是一个delegate对象。

  75. 17建站
    *.*.*.*
    链接

    17建站 2008-06-04 12:20:00

    看懂了~~

  76. Yes!加菲猫
    *.*.*.*
    链接

    Yes!加菲猫 2008-06-04 12:48:00

    linq讲得。。。。上面有人还在问Dlinq是啥,而不知道Dlinq实际就是Linq to sql,我想等你的《我们为什么要拥抱LINQ》,想看看可以从你的文章里能不能发现新东西

  77. BZZ
    *.*.*.*
    链接

    BZZ 2008-06-04 12:51:00

    --引用--------------------------------------------------
    这些东西都是相通的,把握住一个,其他大都不困难,呵呵。

    --------------------------------------------------------
    赞同

  78. Yes!加菲猫
    *.*.*.*
    链接

    Yes!加菲猫 2008-06-04 12:52:00

    Linq to Sql和Linq to Entities的区别是什么,它们的应用场景,和其他的ORM框架有什么样差异和共同点,《我们为什么要拥抱LINQ》这个里面会不会讲?

  79. BZZ
    *.*.*.*
    链接

    BZZ 2008-06-04 12:52:00

    --引用--------------------------------------------------
    阿福: 很必要的文章,尤其是linq方面的概念,确实让初学者头大!
    这应该怪微软自己,很多命名不够明确,比如linq to sql 准确点应该是 linq to sql sever, 还有asp.net的linqdatasource控件准确的就应该是linqtosql(server)datasource嘛!
    而且同一概念前后会出现多个命名。。。
    --------------------------------------------------------
    sql 和 sql server 不是一个概念啊

  80. Yes!加菲猫
    *.*.*.*
    链接

    Yes!加菲猫 2008-06-04 12:57:00

    @BZZ
    linq to sql 准确点应该是 linq to sql sever也不太算对吧,你看它在config里面定义的连接字符串有一个providerName属性,就说明应该不会只有Sql Server这一个Provider吧?
    这个要看MS,IBM,Oracle等厂商它们协调吧,毕竟Sql Server独占并不是一个明智的策略,在一项有重大意义的新技术推广的时候,作为官方应该会很好处理这个吧?

  81. Yes!加菲猫
    *.*.*.*
    链接

    Yes!加菲猫 2008-06-04 13:01:00

    老实讲比delegate,我更喜欢Lambda,太惬意了 。更少的代码,更明亮的语义,懒人的福音~

  82. scotoma
    *.*.*.*
    链接

    scotoma 2008-06-04 13:02:00

    确实还是纠正了好多的概念..楼主太谦虚了

  83. 老赵
    admin
    链接

    老赵 2008-06-04 13:32:00

    --引用--------------------------------------------------
    Yes!加菲猫: Linq to Sql和Linq to Entities的区别是什么,它们的应用场景,和其他的ORM框架有什么样差异和共同点,《我们为什么要拥抱LINQ》这个里面会不会讲?
    --------------------------------------------------------
    不会。
    linq to entities是ado.net entity framework的linq支持。

  84. 老赵
    admin
    链接

    老赵 2008-06-04 13:33:00

    --引用--------------------------------------------------
    Yes!加菲猫: @BZZ
    linq to sql 准确点应该是 linq to sql sever也不太算对吧,你看它在config里面定义的连接字符串有一个providerName属性,就说明应该不会只有Sql Server这一个Provider吧?
    这个要看MS,IBM,Oracle等厂商它们协调吧,毕竟Sql Server独占并不是一个明智的策略,在一项有重大意义的新技术推广的时候,作为官方应该会很好处理这个吧?
    --------------------------------------------------------
    的确是的,我对于这方面扩展也有些心得,有机会也可以讲讲。

  85. xiaosanaiq[未注册用户]
    *.*.*.*
    链接

    xiaosanaiq[未注册用户] 2008-06-04 14:19:00

    强烈推荐看一下c# in a nutshell

  86. 阿拉伯顶峰
    *.*.*.*
    链接

    阿拉伯顶峰 2008-06-04 14:23:00

    仰望中。。。。。。。。。。。。。。。。。
    问题一:在项目中我用nhibernate好呢?还是用linq to sql好呢?写篇关于这方面的文章,我是没有意见的!呵呵,不知道楼里的通知有没有建议。

  87. 老赵
    admin
    链接

    老赵 2008-06-04 14:34:00

    @阿拉伯顶峰
    看你的项目数据库印射规则是不是复杂,简单的话就用linq to sql吧。

  88. 平静中的疯狂
    *.*.*.*
    链接

    平静中的疯狂 2008-06-04 17:08:00

    老赵的文章,不看铁定亏

  89. 平静中的疯狂
    *.*.*.*
    链接

    平静中的疯狂 2008-06-04 17:10:00

    我的衣橱啥时候改版的?
             

  90. xjb
    *.*.*.*
    链接

    xjb 2008-06-04 18:08:00

    好文章呀

  91. CindyChen[未注册用户]
    *.*.*.*
    链接

    CindyChen[未注册用户] 2008-06-04 18:33:00

    “我的衣橱”是61改版的吧。
    给那些女人用还不错,呵呵呵……

  92. CindyChen[未注册用户]
    *.*.*.*
    链接

    CindyChen[未注册用户] 2008-06-04 18:36:00

    谢谢老赵的解释,对于我来说还是很必要的哇!
    认真学习。

  93. 阿不
    *.*.*.*
    链接

    阿不 2008-06-04 20:14:00

    老赵够忙,够累,够呛

  94. 图灵刘江
    *.*.*.*
    链接

    图灵刘江 2008-06-05 00:43:00

    好文章。赞一个!

  95. 老赵
    admin
    链接

    老赵 2008-06-05 09:11:00

    --引用--------------------------------------------------
    图灵刘江: 好文章。赞一个!
    --------------------------------------------------------
    仔细读读就发现其实……很多话都没有说通。

  96. 穆东波
    *.*.*.*
    链接

    穆东波 2008-06-05 10:47:00

    新手,学习中...

  97. lauralxj[未注册用户]
    *.*.*.*
    链接

    lauralxj[未注册用户] 2008-06-05 17:20:00

    string[] words = { "hello", "wonderful", "linq", "beautiful", "world" };
    var shortWords = from word in words
    where word.Length <= 5
    select word;
    像這個數據源 shortWords 如何綁定到Asp.net listview控件?
    謝謝~

  98. 老赵
    admin
    链接

    老赵 2008-06-05 17:35:00

    @lauralxj
    直接设为DataSource就可以了阿

  99. lauralxj[未注册用户]
    *.*.*.*
    链接

    lauralxj[未注册用户] 2008-06-05 17:39:00

    不行的,要是綁定在Gridview裏沒問題,但listview需要模板不知道如何寫了!太快了吧,我在線等呢?嘿嘿,謝謝!

  100. 老赵
    admin
    链接

    老赵 2008-06-05 18:48:00

    --引用--------------------------------------------------
    lauralxj: 不行的,要是綁定在Gridview裏沒問題,但listview需要模板不知道如何寫了!太快了吧,我在線等呢?嘿嘿,謝謝!
    --------------------------------------------------------
    那你只是要知道ListView的模版写法而已……看文档就可以了阿。

  101. lauralxj[未注册用户]
    *.*.*.*
    链接

    lauralxj[未注册用户] 2008-06-05 19:44:00

    shortWords 最終是個IEnumerable<string> 類型 ,我對數據源底層的東西不了解,所以在模板裏面綁定的時候不知道如何綁定:
    <%#Eval("?")%>
    我試了
    <%#Eval("Key")%>
    <%#Eval("Value")%>
    <%#Eval("ITEM")%>
    都不行,希望給個答案!謝謝!
    或者 釷對我這種問題 老趙 你能專寫一篇關於IEnumerable 和Collections
    集合的,表達不是很清楚,煩請老趙指點迷津了!謝謝!

  102. 老赵
    admin
    链接

    老赵 2008-06-05 21:43:00

    @lauralxj
    <%# Container.DataItem %>

  103. lauralxj[未注册用户]
    *.*.*.*
    链接

    lauralxj[未注册用户] 2008-06-06 12:01:00

    --引用--------------------------------------------------
    Jeffrey Zhao: @lauralxj
    &lt;%# Container.DataItem %&gt;
    --------------------------------------------------------
    問題已解決,還不怎麽明白,如果我在後台通過代碼的方式綁定到Dropdownlist
    呢? 如何指定ItemText /Itemvalue?
    請問我有這種問題的原因是不是對數據源底層不了解造成的?謝謝!

  104. lauralxj[未注册用户]
    *.*.*.*
    链接

    lauralxj[未注册用户] 2008-06-06 12:04:00

    --引用--------------------------------------------------
    lauralxj: --引用--------------------------------------------------
    Jeffrey Zhao: @lauralxj
    &amp;lt;%# Container.DataItem %&amp;gt;
    --------------------------------------------------------
    問題已解決,還不怎麽明白,如果我在後台通過代碼的方式綁定到Dropdownlist
    呢? 如何指定ItemText /Itemvalue?
    請問我有這種問題的原因是不是對數據源底層不了解造成的?謝謝!
    --------------------------------------------------------
    搞錯了,是
    DataTextField
    DataValueField

  105. 老赵
    admin
    链接

    老赵 2008-06-06 16:57:00

    @lauralxj
    dropdownlist就不行了

  106. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2008-06-06 22:03:00

    呵呵,老赵还是这么勤奋的发帖子,强。

  107. redfoxlee[未注册用户]
    *.*.*.*
    链接

    redfoxlee[未注册用户] 2008-06-16 23:52:00

    第一反应的话,那就是返回的类型不一样吧,这样的话就要抓住返回类型的特点。

    IQueryable<T> 接口使查询成为多态类型。即,因为对 IQueryable 数据源的查询表示为一个表达式目录树,所以可以对不同类型的数据源执行此查询。

    不知道理解的对不对……

  108. 老赵
    admin
    链接

    老赵 2008-06-17 09:51:00

    --引用--------------------------------------------------
    redfoxlee: 第一反应的话,那就是返回的类型不一样吧,这样的话就要抓住返回类型的特点。

    IQueryable&lt;T&gt; 接口使查询成为多态类型。即,因为对 IQueryable 数据源的查询表示为一个表达式目录树,所以可以对不同类型的数据源执行此查询。

    不知道理解的对不对……
    --------------------------------------------------------
    上面其实已经有人写了,呵呵。

  109. redfoxlee[未注册用户]
    *.*.*.*
    链接

    redfoxlee[未注册用户] 2008-06-17 23:26:00

    呵呵,中间没看下去……不好意思。当时只是好奇自己到底能不能答出来,索性就没往下看呢。不过趁这个机会也正好学了不少东西,反正答错了也是赚么,哈哈。

  110. 聽雨
    *.*.*.*
    链接

    聽雨 2008-06-24 21:55:00

    看完之后就想对老赵说两个字

    “谢谢”

  111. A.Z![未注册用户]
    *.*.*.*
    链接

    A.Z![未注册用户] 2008-06-25 14:20:00

    本来蛮好的一篇文章,最后却耍个小聪明
    第一个Where方法的参数是Func<TSource, bool> predicate,第二个Where方法的参数是Expression<Func<TSource, bool>> predicate
    前者直接调用IEnumerable<TSource>的Where方法,后者需要构造表达式目录树,再调用IQueryable<TSource>的Where方法
    就这么简单的事,还在这儿大呼小叫的,拿来卖弄,典型的“茴”字几种写法

  112. A.Z![未注册用户]
    *.*.*.*
    链接

    A.Z![未注册用户] 2008-06-25 17:09:00

    LINQ特指形如上面这段代码中from...where...select这样的用法,其返回值是IQueryable<T>。
    __________________________________________
    IEnumerable<char> stringQuery =
    from ch in aString
    select ch;

    为什么这段代码可以正确运行呢?难道它的返回值也是IQueryable<char>?
    请“专家”解答一下!

  113. 老赵
    admin
    链接

    老赵 2008-06-25 19:38:00

    @A.Z!
    我记得已经改成了IQueryable或IEnumerble了,原来没改,谢谢指证。
    // 当然IQueryable继承IEnumerble

  114. 心有灵犀
    *.*.*.*
    链接

    心有灵犀 2008-07-10 11:06:00

    这些都是很基本的东西,只要平时仔细看看,都能理清楚的。
    感觉现在很多.net程序员很浮躁,我认为很大原因是微软发布新技术太快,而大家又想很快掌握这些技术。
    其实很多技术是相通的,只要很好的理解了其中的原理,学这些新东西其实很快的。

  115. 心有灵犀
    *.*.*.*
    链接

    心有灵犀 2008-07-10 11:08:00

    忘了顶下老赵了,不知道老赵现在减肥没,上次见过,那叫魁梧啊^_^

  116. 神在人间
    *.*.*.*
    链接

    神在人间 2008-07-24 14:16:00

    支持一下,学到了很多!

  117. 匆匆
    *.*.*.*
    链接

    匆匆 2008-11-13 16:36:00

    不错的文章

  118. woradmen[未注册用户]
    *.*.*.*
    链接

    woradmen[未注册用户] 2009-01-13 17:16:00

    请教赵老师:
    ASP.NET AJAX是面向特定服务器技术!
    它里面有请求服务器的方法。
    那么我使用 Jquery中的ajax方法 也可以请求服务器的。

    您认为他们俩者方法有什么区别?





  119. 柳城之城
    *.*.*.*
    链接

    柳城之城 2009-02-06 16:03:00

    首先说:赵老师,辛苦了!

    赵老师说的很明白。
    不过对我来说前两个还行,第三个问题由于有一些相关的概念暂时还没有搞清楚,所以不太懂。以后再来看看。

    留言的另一个原因是我有一个想法要跟微软的开发团队、开发团队的管理者说,但是人微言轻,或者说是烧香找不到庙门,拜托赵老师代为转达:目前的.net技术队初学者来说过于庞杂,要想办法解决。

    .net技术从1.0(最早的时候可能还是asp+呢)到2.0、3.5飞速发展,很多人都从中受益。我自已呢,正在从初学者向“熟悉”这个程度过渡中,跳出我的自己的立场,如果站在初学者的角度来看,2.0版本在通过母板页、数据库控件、用户控件等等功能,可能让人迅速掌握,简单的网站开发,然后再逐渐深入。

    但是,接下来的过程就是非常痛苦了:一方面,.net博大精深,需要学习的东西太多,另一方面,.net本身还在飞速发展,相关的内容还在持续的膨胀。好像,是沿着小溪顺流而下,可是走着走着,忽然看到了一片大海。让人无所事从。

    我是一个从业多年的人,我能理解,为了同java或者其它技术进行竞争,.net技术也必须不断的向前发展。

    但是,.net的发展离不开开发人员的支持,需要争取更多的人加入到.net的阵营中来,也需要让已经进入到这个阵营中的人,不断的提高应用水平。

    而我的担心就是目前的情况来看,.net似乎有点过火了,好像是为了领先而领先,为了潮流而潮流,对于初学者来说,过于庞杂了。细数一下:C#、泛型、web服务器控件、.net框架和模式、web service、缓存和web part等等2.0技术,还有asp.net ajax、LINQ、匿名函数等等破这些3.0 3.5版本的技术。我自己的感觉是,才学会一点东西,马上新的技术就出现了。

    我是没有办法上达“天听”,赵老师如果有机会就代我说一说吧。

  120. 西狐
    *.*.*.*
    链接

    西狐 2009-02-08 23:18:00

    ......无语了,还真人搞不清概念的啊..?

  121. jdmei520
    *.*.*.*
    链接

    jdmei520 2009-09-26 17:29:00

    可能是大家在提问的时候使用专业术语不严谨。O(∩_∩)O~

  122. T-Shine
    *.*.*.*
    链接

    T-Shine 2010-03-27 16:23:00

    @Jeffrey Zhao


    DLinq是 LINQ to SQL最初的称呼。
    刚翻书时看到的……

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我