您的位置:首页 > 其它

Hello My LINQ World——自定义LINQ Provider实现LINQ to LDAP查询(其三)

2013-01-31 10:35 776 查看

引言

说明

由于博客园是个技术社区,所以我得显得严谨点,这里留下几点说明,我会在接下来的几篇文章中(如果有的话)重复这个说明。

其一,这篇(或者系列,如果有的话)文章是为了和大家一起入门(注意不是指导)。所以所编写的代码仅仅是示例的,或者说是处于编写中(完善中)的。

其二,至于为什么在学习的过程中就着手写这些文章,那是因为我深深觉得作为入门,这些内容还是容易的,但是常常让人却而退步。比如在一周之前,我还问博客园中的另一位博主,请求资料。那个时候我还觉得非常困难,非常苦恼。但是,经过一些摸索,一些文章的指导之后,却轻轻叩开了LINQ的门,一窥其瑰丽了。

其三,其实网上并不是没有LINQ的教程(指编写Provider)。但是“会”和不会往往隔了一点顿悟。就像“水门事件”一样。所以作为初学者来和大家一起探讨可以让彼此更同步。

其四,这真的是一个非常有挑战,非常有趣的内容。我接触了之后就忍不住和大家一起分享,邀大家一起参与冒险。

最后,这里列出所有我参考的,觉得有价值的资源。

其一,MSDN的博客: http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx

这系列文章直接和本系列文章相关。07年的帖子,13年才发现,真该面壁思过。

其二,http://weblogs.asp.net/mehfuzh/archive/2007/10/04/writing-custom-linq-provider.aspx

待会会在文章中引用到这个博主写的一个非常短小的Provider示例。

其三,博客园中某个博主的作品http://www.cnblogs.com/Terrylee/category/48778.html

大神的文章读起来有点累,所以这系列我访问了好几次,愣是没看懂怎么回事,不过里面有张图挺不错。

接上文

在上一篇文章中,我们成功的将一个lambda表达式转换为被DirectorySearcher接受的Filter字符串。煽情点说,我们已经构建了LINQ查询和LDAP查询的桥梁。“这具有重大意义!”,好比听懂了方言。其实在上一篇中我提到,最后一篇的内容不会特别多。但是如果直接附在上一篇的话,就会使那篇显得有点长(当然这只是一个借口,很大程度上是我的强迫症在作怪),所以我要紧牙关写了第三篇。同时我在编码的过程中,脑海中浮现了一些问题和想法,想和大家分享。

另外,这篇文章算得上是“暂时告别篇”。和园友留言交流的时候我多次表明了自己的决心,所以我会长期跟进这个系列,但是不会像这三篇文章那么连续了。这三篇文章算是补上LINQ Provider实现这方面的“空白”,希望能帮助到喜欢和想要了解LINQ的朋友们。另外,再强调一次,http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx,这个帖子其实已经包含了绝大多数“实现LINQ Provider”的内容,非常有价值。

Hello World

接下来我们就要完成这个Hello World并使之运行了,虽然我们已经耗费了很长的时间,但是值得。还记得高一的电脑课上,第一次输入VB代码的时候因为拼写错误抓狂了半天(也是高中唯一一次编码)。在第一篇中,我们把7个需要实现的方法缩减为1个。现在就去实现那个方法。从第二篇到这一篇,我已经对部分代码做了较大程度的更改。比如,为User类型提供了构造函数以保存结果。为Provider类型和Context类型提供了Username,Password,Path等属性以方便访问AD,同时还为他们提供了PropertiesToLoad只读属性用来加快LDAP搜索(关于这点,可以参考我的另外一篇文章:/article/5695674.html),另外为User提供了GetDirectory方法来增强实用性。下面是User类型,贴出来作为示例。

View Code

foreach (var i in (IEnumerable<SearchResult>) getObjectEnumerable<SearchResult>( result2))
{
Console.Write(".");
}


这其实是过度担心的做法,前面的例子已经说明了,调用ToArray和不调用ToArray的区别了。不过还是请大家亲手试试。LINQ的延时查询非常完美的支持了“分段求值”(大家或许还注意到我注释掉的那个yield return,我害怕Cast<>和Select破坏了原有的枚举,现在看来是担心过度了)。

备注

我按照原样将我的想法和验证步骤(当然如果我验证过程中出错,我自动纠正,只提供我认为“正确”的做法,以缩减篇幅)写在这里,欢迎各位朋友一起讨论。

结语

OK,这个系列到这里暂停了。2号就准备回家,宽带被我妈迁到她工作的地方了,没打算迁回家。原本还纠结假期怎么发博客呢,现在总算不用担心了。如大家所见,我比较快的给这个系列开完了头,但是接下来的事情就不那么容易了,我们要实现更多的操作符/更丰富的查询,还要进行优化。我会坚持更新文章,同时希望对这方面感兴趣的朋友也推出自己的文章,方便大家学习讨论。:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: