日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【转】WSS3.0开发--你还在为写CAML痛苦吗?

發(fā)布時(shí)間:2025/3/17 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】WSS3.0开发--你还在为写CAML痛苦吗? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

進(jìn)行WSS3或MOSS開(kāi)發(fā)的朋友不可避免的要處理各種List的查詢(xún),編寫(xiě)類(lèi)似下面的CAML語(yǔ)句:

<Where>
<And>
?
<And>
??
<Eq><FieldRef?Name=”Title”><Value?Type=”Text”>Value</Value></Eq>
??
<Eq><FieldRef?Name=”ContentType”><Value?Type=”Text”>Product</Value></Eq>
?
</And>
?
<Eq><FieldRef?Name=”Field1”><Value?Type=”Text”>Value</Value></Eq>
</And>?
<Or>
?
<Or>
??
<Eq><FieldRef?Name=”Title”><Value?Type=”Text”>Value</Value></Eq>
??
<Eq><FieldRef?Name=”ContentType”><Value?Type=”Text”>Product</Value></Eq>
?
</Or>
?
<Eq><FieldRef?Name=”Field1”><Value?Type=”Text”>Value</Value></Eq>
</Or>?
</Where>

痛苦吧? 簡(jiǎn)單的還好,復(fù)雜一點(diǎn)的caml查詢(xún)絕對(duì)會(huì)讓你暈頭轉(zhuǎn)向。
現(xiàn)在網(wǎng)上的解決方案有幾種:
1)CAMLBuilder:提供一個(gè)Window程序,可以動(dòng)態(tài)生成CAML,然后開(kāi)發(fā)人員可以粘貼進(jìn)代碼代碼中。
http://blog.u2u.info/DottextWeb/patrick/archive/2005/05/29/3522.aspx
2)CAML.net : 提供了一個(gè)類(lèi)庫(kù),可以如下的編寫(xiě)CAML:
http://www.codeplex.com/camldotnet

string?typeName?=?"My?Content?Type";
string?simpleQuery?=
????CAML.Query(
????????CAML.Where(
????????????CAML.Or(
????????????????CAML.Eq(
????????????????????CAML.FieldRef(
"ContentType"),?
????????????????????CAML.Value(typeName)),
????????????????CAML.IsNotNull(
????????????????????CAML.FieldRef(
"Description")))),
????????CAML.GroupBy(
????????????
true,
????????????CAML.FieldRef(
"Title",CAML.SortType.Descending)),
????????CAML.OrderBy(
????????????CAML.FieldRef(
"_Author"),
????????????CAML.FieldRef(
"AuthoringDate"),
????????????CAML.FieldRef(
"AssignedTo",CAML.SortType.Ascending))
????);


3)還有一位兄弟寫(xiě)了個(gè)支持用sql語(yǔ)句形式的caml類(lèi)庫(kù),查詢(xún)語(yǔ)句如下:

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/>");

上面的三種方案,個(gè)人還是比較喜歡CAML.net的實(shí)現(xiàn),純代碼,但是它的語(yǔ)法不是那么的"優(yōu)雅"。
以前寫(xiě)過(guò)一個(gè)數(shù)據(jù)庫(kù)ORM工具,見(jiàn)(DBO),實(shí)現(xiàn)了如下的數(shù)據(jù)查詢(xún)語(yǔ)法:

QueryExpression?expr?=
?????????????DboQuery.Select(?User.__UserName,Org.__OrgName?)
?????????????.From
<User>()
?????????????.InnerJoin
<Org>().On(User.__OrgId,?Org.__OrgId)
?????????????.Where(Org.__OrgId?
==?2?|?Org.__OrgId?==?3);
?IList
<RefOrgUser>?orgs?=?_session.Query<RefOrgUser>(expr)?;

于是,計(jì)劃開(kāi)發(fā)類(lèi)似語(yǔ)法的CAML查詢(xún)類(lèi)庫(kù)--CodeArt.SharePoint.CAMLQuery.dll。
07年六月份開(kāi)始開(kāi)發(fā),已經(jīng)用到了實(shí)際的項(xiàng)目中,實(shí)現(xiàn)了幾個(gè)復(fù)雜的查詢(xún)功能,好東西不敢獨(dú)享,哈哈,給大家show一下。
(在后面大家可以找到dll的下載鏈接)
以下的代碼示例針對(duì)一個(gè)列表CAMLList做查詢(xún),此列表有如下字段:標(biāo)題,正文,修改時(shí)間。

首先,引用名稱(chēng)空間。

using?System.Data;
using?Microsoft.SharePoint;
using?CodeArt.SharePoint.CAMLQuery;

代碼1:查詢(xún)標(biāo)題中包含"XXX"的 項(xiàng)目:

??QueryField?titleField?=?new?QueryField("標(biāo)題");

? SPSite?site?
=?new?SPSite("http://jyserver:9000");
? SPList?list?
=??site.RootWeb.Lists["CAMLTest"];

?? SPQuery?q?
=?new?SPQuery?();
?? q.Query?
=?CAMLBuilder.Where(?list?,?titleField.Contains("XXX")?);
???????????
?? SPListItemCollection?items?
=?list.GetItems(q);
??
int?count?=?items.Count;?????????

代碼2:查詢(xún)標(biāo)題中包含"XXX"或"YYY"的 項(xiàng)目:

?SPList?list?=?this.GetTestList();

? ICAMLExpression?expr?
=?QueryModel.Title.Contains("XXX")?||?QueryModel.Title.Contains("YYY");????????????

? PQuery?q?
=?new?SPQuery();
? q.Query?
=?CAMLBuilder.Where(list,?expr?);

? SPListItemCollection?items?
=?list.GetItems(q);
?
int?count?=?items.Count;

代碼3:我們可以創(chuàng)建一個(gè)查詢(xún)模型,類(lèi)似一個(gè)實(shí)體類(lèi),針對(duì)這個(gè)類(lèi)進(jìn)行查詢(xún):

/**////?<summary>
????????
///?查詢(xún)模型
????????
///?</summary>

????????class?QueryModel
????????
{
????????????
public?static?FieldRef<QueryModel>?Title?=?new?FieldRef<QueryModel>("標(biāo)題");
????????????
public?static?FieldRef<QueryModel>?Body?=?new?FieldRef<QueryModel>("正文");
????????????
public?static?TypeFieldRef<QueryModel,?DateTime>?ModifyTime?=?new?TypeFieldRef<QueryModel,?DateTime>("修改時(shí)間");
????????}

????????[TestMethod]
????????
public?void?TestModelQuery()
????????
{??????????
????????????SPList?list?
=?this.GetTestList();
????????????SPQuery?q?
=?new?SPQuery();
????????????q.Query?
=?CAMLBuilder.Where(?list?,??QueryModel.Title.Contains("XXX")?);
????????????q.ViewFields?
=?CAMLBuilder.ViewFields(?list?,?QueryModel.Title,?QueryModel.Body);
????????????SPListItemCollection?items?
=?list.GetItems(q);
????????????
int?count?=?items.Count;
????????}

代碼4:按照邏輯動(dòng)態(tài)拼接查詢(xún),以下示例查詢(xún)標(biāo)題中包含"XXX"或"YYY"的 項(xiàng)目,按照queryByTime 參數(shù),附加修改時(shí)間條件:

?SPList?list?=?this.GetTestList();

?
bool?queryByTime?=?true?;

? TypedCAMLExpression<QueryModel> expr = QueryModel.Title.Contains("XXX") || QueryModel.Title.Contains("YYY");
?
????????
?
if(?queryByTime?)
??????? expr?
=?expr?&?QueryModel.ModifyTime?>=?DateTime.Now.AddDays(-1)

?? SPQuery?q?
=?new?SPQuery();
?? q.Query?
=?CAMLBuilder.Where(list,?expr?);

?? SPListItemCollection?items?
=?list.GetItems(q);
?
int?count?=?items.Count;

代碼5:我們可以用類(lèi)似sql的強(qiáng)類(lèi)型語(yǔ)法:

?QueryField?titleField?=?new?QueryField("標(biāo)題");
QueryField?bodyField?
=?new?QueryField("正文");

????????????SPList?list?
=?this.GetTestList();
??? ?? ?? //只查詢(xún)兩個(gè)字段
????????????SPListItemCollection?result1?
=
????????????????ListQuery.Select(titleField,?bodyField)
????????????????????????.From(list)
????????????????????????.Where(titleField.Contains(
"XXX"))
????????????????????????.GetItems();

????????????
int?count?=?result1.Count;
??? ?? ?? //查詢(xún)所有字段
????????????SPListItemCollection?result2?
=
????????????????ListQuery.From(list)
?????????????????????????.Where(titleField.Contains(
"XXX"))
?????????????????????????.GetItems();

????????????
int?count2?=?result2.Count;

??? ?? ?? //直接返回DataTable
????????????DataTable?result3?
=
????????????????ListQuery.Select(titleField,bodyField)
????????????????????????.From(list)
?????????????????????????.Where(titleField.Contains(
"XXX")|titleField.Contains("YYY"))
?????????????????????????.OrderBy(?titleField?,?
false?)
?????????????????????????.GetDataTable();

????????????
int?count3?=?result3.Rows.Count;


下載dll: https://www.codeplex.com/camlquery

最新版本的接口可能有變化,使用時(shí)請(qǐng)參考最新的文檔。

附:
原來(lái)還有第五種方案: 用 .net3.5的朋友可以試試LINQtoSharePoint,跟o這個(gè).net2.0的好像差不多:
http://www.codeplex.com/LINQtoSharePoint

轉(zhuǎn)載于:https://www.cnblogs.com/NetUser/archive/2013/03/11/2954191.html

總結(jié)

以上是生活随笔為你收集整理的【转】WSS3.0开发--你还在为写CAML痛苦吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。