Erucy's blog

Erucy's blog
随笔 - 35, 评论 - 107, 引用 - 1

导航

标签

每月存档

最新留言

广告

 

可以像写SQL语句那样来写CAML查询,点击这里免费下载。

我没有经过太大量的测试(没有覆盖到每种可能的分支),目前还处在beta版,欢迎大家试用。

如果有什么问题,可以在这里回复,或致信通向分享:feedback(at)CollaDec.com。感谢支持!

 

其实之前也有一些国外的人做了一些生成CAML查询的东西(毕竟CAML还是太难写了,主要问题倒不在于xml,而在于那些内部名称)

不过看了一眼之前的那个CAML Generator,本质上还是像xmlwriter那样去加那些结点,而且没有解决内部名称的问题

然后想写一个客户端去生成CAML,就像SQL Server里做视图的那样,后来觉得还是不太方便,索性打算写一个直接像SQL那样的语句去直接查询内容

其实这个东西的核心内容就是一个T-SQL语句的解析器

之前一直想不好怎么做比较方便,也参考了一些开源的解析器,帮助不是很大,这也是拖了很久的原因。

最近在做实验室的程序的时候做了类似的东西,于是借着手熟就顺手写了

主要就是借助几个数组去存那些查询字段、查询条件、排序字段、分组字段,

手写了一个状态机(懒得再去找开源状态机组件了,而且还得再带个dll,比较麻烦),标记出每个成分后面允许的内容(比如在select后面的返回字段后面,可以是一个逗号,也可以是where、order或者group),难度并不大,只要想清楚了就是个体力活。不过估计这个状态机应该还能再精简一些,等有空再分析分析吧。

另外一个比较核心的部分就是查询表达式的处理,把那种查询条件转换成xml格式的,这个其实就相当于表达式计算问题,随便找本数据结构的书上应该就有(分成两步:中缀表达式转后缀表达式、后缀表达式的计算)。

然后就是把那些列表名称、字段名称该分析的分析、该转换的转换,这个就很容易了。

下一步对这个的打算,除了找找bug、优化一下算法,可能考虑添加对跨列表、跨网站查询的支持,以及对moss中search的支持(这个可能比较麻烦)。

给个小sample:

SPWeb web = SPContext.Current.Web;
string queryStr = "SELECT * FROM 通知 WHERE ID>10";
FriendlyQuery query = new FriendlyQuery(web, queryStr);
query.RowLimit = 100;
query.Scope = FriendlyQuery.QueryScope. AllItemsAndFolders;
SPListItemCollection items = query.GetItems();
foreach(SPListItem i in items)
    Response.Write(i.Title + "<br/>");

打印 | 张贴于 2007-09-16 01:08:00 | Tag:SharePoint

留言反馈

#re:FriendlyQuery正式发布 编辑

请问能不能发给我一份啊

huxiangwen2008@yahoo.com.cn

2009-04-27 23:34:54 | xiangwenhu2008
#re:FriendlyQuery正式发布 编辑

请问能不能发给我一份啊

2009-04-27 23:34:14 | xiangwenhu2008
#re: FriendlyQuery正式发布 编辑
什么时候支持跨列表和跨网站呢
2008-12-26 13:34:12 | [匿名:virusswb]
#re: FriendlyQuery正式发布 编辑
我刚才才发现所谓的联合查询,只是找到多个列表中包含你想要的字段的记录,不是我一开始理解的join联合查询

我研究了两天才发现是这样的

我一直在找sql中where后面的列表1.id=列表2.id,可是证明没有这个东西,不是这么回事,这个好像没有什么用啊

查出来一堆的乱七八糟的东西,字段的个数都不一样,有用吗?
2008-11-06 15:44:47 | [匿名:virusswb]
#回复: FriendlyQuery正式发布 编辑
这里有一个开源的parser, 可以用来解析T-SQL
不过得自己写规则

http://www.codeproject.com/csharp/spart.asp
2007-09-21 13:19:00 | [匿名:Erucy]
#回复: FriendlyQuery正式发布 编辑
能不能告诉我一些 开源的T-SQL解析器的项目名字及地址,想学习一下,谢谢
2007-09-21 08:44:00 | [匿名:ark]
#回复: FriendlyQuery正式发布 编辑
moss中search的支持也不麻烦

对的
2007-09-19 15:30:00 | [匿名:视频聊天]
#回复: FriendlyQuery正式发布 编辑
性能多少肯定会有些影响
因为是先解析成caml, 再调用SPQuery生成的
不过我觉得应该影响不会太大, 没有实际测过
额外的时间主要化在sql解析和遍历列表字段

当然如果很在意效率的话, 还是写CAML最好, 呵呵
2007-09-17 23:21:00 | [匿名:Erucy]
#回复: FriendlyQuery正式发布 编辑
moss中search的支持也不麻烦
2007-09-17 12:58:00 | [匿名:mossguru]
#回复: FriendlyQuery正式发布 编辑
SPWeb web = SPContext.Current.Web;
string queryStr = "SELECT * FROM 通知 WHERE ID>10";
FriendlyQuery query = new FriendlyQuery(web, queryStr);
query.RowLimit = 100;
query.Scope = FriendlyQuery.QueryScope. AllItemsAndFolders;
SPListItemCollection items = query.GetItems();
foreach(SPListItem i in items)
Response.Write(i.Title + "<br/>");



///如果内部用数组来解析你这个sql ,然后代码开发
是不是性能出现一定的问题?
2007-09-17 09:27:00 | [匿名:AA]
#回复: FriendlyQuery正式发布 编辑
用fQuery.QueryXml就能得到生成出来的CAML的string
动态生成服务器端文件的话可能会有权限问题, 呵呵
可以拿来直接扔到列表里

如果需要绑定的话就更好办了
SPListItemCollection有个GetDataTable方法,可以直接返回DataTable, 直接用GetItems拿那个item collection就行了
2007-09-16 22:04:00 | [匿名:Erucy]
#回复: FriendlyQuery正式发布 编辑
好! 以前用U2U的
using U2U.SharePoint.CAML.Server;
.....
CAMLHelper hlp = new CAMLHelper(Server.MapPath("~/UserControls/products.caml"));

DataGrid1.DataSource = hlp.ExecuteQuery();
DataGrid1.DataBind();
主要是动态的生成那个caml文件,FriendlyQuery也可以考虑下,我觉得蛮方便的!
2007-09-16 21:28:00 | [匿名:pccai]
#回复: FriendlyQuery正式发布 编辑
如果有用 .Net 3.5 的,也可以考虑使用 Linq to SharePoint:

http://www.codeplex.com/LINQtoSharePoint
2007-09-16 10:24:00 | [匿名:梁利锋]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.2.0