首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

遇到多个list联合查询的有关问题,where条件来自多个表

2013-02-02 
遇到多个list联合查询的问题,where条件来自多个表遇到多个list联合查询的问题,需要用CAML做到类似于SQL中

遇到多个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爽,以后出报表就这么干了。

热点排行