遇到多个list联合查询的问题,where条件来自多个表
遇到多个list联合查询的问题,需要用CAML做到类似于SQL中的:
select A.*,A.CityID,B.CityNAME from tableA A left join tableB B on A.CityID=B.ID where tableA .Name=xxx or tableB.CityName=xxx or....
SPSiteDataQuery siteQuery = new SPSiteDataQuery();
siteQuery.Webs = "<Webs Scope=\"SiteCollection\" />";
siteQuery.Lists = string.Format("<Lists><List ID='{0}' /><List ID='{1}' /></Lists>", web.Lists["员工信息表"].ID, web.Lists["Hitech通讯录"].ID);
siteQuery.ViewFields = string.Format("<FieldRef Name='{0}' Nullable=\"TRUE\" /><FieldRef Name='{1}' Nullable=\"TRUE\" /><FieldRef Name='{2}' Nullable=\"TRUE\" /><FieldRef Name='{3}' Nullable=\"TRUE\" /><FieldRef Name='{4}' Nullable=\"TRUE\" /><FieldRef Name='{5}' Nullable=\"TRUE\" /><FieldRef Name='{6}' Nullable=\"TRUE\" />",
web.Lists["员工信息表"].Fields["姓名"].InternalName, web.Lists["员工信息表"].Fields["拼音"].InternalName,
web.Lists["员工信息表"].Fields["员工部门"].InternalName, web.Lists["员工信息表"].Fields["员工科室"].InternalName,
web.Lists["Hitech通讯录"].Fields["短号"].InternalName, web.Lists["Hitech通讯录"].Fields["手机号"].InternalName, web.Lists["Hitech通讯录"].Fields["座机"].InternalName);
siteQuery.RowLimit = 10;
string queryStr = string.Format(@"<Where>
<Or>
<Or>
<Or>
<Or>
<Or>
<Contains>
<FieldRef Name='{0}' />
<Value Type='Text'>{1}</Value>
</Contains>
<Contains>
<FieldRef Name='{2}' />
<Value Type='Text'>{1}</Value>
</Contains>
</Or>
<Contains>
<FieldRef Name='{3}' />
<Value Type='Text'>{1}</Value>
</Contains>
</Or>
<Contains>
<FieldRef Name='{4}' />
<Value Type='Text'>{1}</Value>
</Contains>
</Or>
<Contains>
<FieldRef Name='{5}' />
<Value Type='Text'>{1}</Value>
</Contains>
</Or>
<Contains>
<FieldRef Name='{6}' />
<Value Type='Text'>{1}</Value>
</Contains>
</Or>
</Where>", empCodeFieldName, queryString, empNameFieldName, empPinyinFieldName,
empDepartFieldName, empPartFieldName, empPositionFieldName); siteQuery.Query = queryStr;
dt = web.GetSiteData(siteQuery);
join多个表用的是SPSiteDataQuery实现的,其中的where查询条件来自多个表 ,当期情况如果where条件是都来自一个表那么得到的结果是对的,如果大于一个表用这个写法就不对了,求正确的写法,谢谢!
[解决办法]
SPSiteDataQuery不支持join吧。
只有SP2010中才支持join的写法。叫Projection。再查查吧。
[解决办法]
楼上说的对
要用caml做join在moss2007里面是不行的
[解决办法]
我记得貌似是这样 ViewFields的每个字段设成这样试试 <FieldRef Name="Title" Nullable="TRUE" />
要不然如果多个列表里面如果有的有这个字段有的没有就会有问题
[解决办法]
1:因为不知道你两个列表字段的设计,Type是否都是Text,是否有查阅项,是否有数值类型,这是有可能出错的地方。
2:SPSiteDataQuery在查找时,对于列表之间对应列的关联等其他问题都不能做的很好。
所以,建议单独做出两个列表的项目集合,或转为DataTable 然后使用LinQ进行再次查找。
[解决办法]
这个太难写了,如果已经知道了list.ID。可以用sharepoint linq 来查。
http://msdn.microsoft.com/en-us/library/ff798485.aspx
------解决方案--------------------
SharePoint提供的Caml查询太麻烦,对于一个表来说,还可以接受,多个表就疯了。我也是深受其害啊。当时有家用户要求的报表特复杂,我都快疯了。一怒之下,决定自己动手,自己研究SharePoint的表结构。研究的最终结果,所有的用户数据都存在WSS_Content_****数据库中的AllUserData表中,通过AllLists来关联所要的列表,剩下的就是找字段对应关系。呵呵,一切搞定,还是自己写SQL爽,以后出报表就这么干了。