SharePoint Joins

SharePoint List

We are having two lists for this example. ContactDetails and ProjectDetails.

SharePoint App settings to read List Data


SharePoint App settings

ListJoins.aspx

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ListJoins.aspx.cs" Inherits="CamlQueryWeb.Pages.ListJoins" %>
  2. <!DOCTYPE html>
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form id="form1" runat="server">
  9. <div>
  10. <br />
  11. <br />
  12. <div>
  13. ContactDetails List
  14. <asp:GridView ID="grdContactDetails" runat="server"></asp:GridView>
  15. </div>
  16. <br />
  17. <br />
  18. <div>
  19. ProjectDetails List
  20. <asp:GridView ID="grdProjectDetails" runat="server"></asp:GridView>
  21. </div>
  22. <br />
  23. <br />
  24. <div>
  25. [ ProjectDetails left join ContactDetails ]
  26. <asp:GridView ID="grdListJoin" runat="server"></asp:GridView>
  27. </div>
  28. </div>
  29. </form>
  30. </body>
  31. </html>
ListJoins.aspx.cs code
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. // The following code gets the client context and Title property by using TokenHelper.
  4. // To access other properties, the app may need to request permissions on the host web.
  5. var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
  6. using (var clientContext = spContext.CreateUserClientContextForSPHost())
  7. {
  8. clientContext.Load(clientContext.Web, web => web.Title);
  9. clientContext.ExecuteQuery();
  10. Response.Write(clientContext.Web.Title);
  11. }
  12. JoinOperation();
  13. }
Step 1: Bind ContactDetails Grid with List Data
  1. List ContactDetailsList = clientContext.Web.Lists.GetByTitle("ContactDetails");
  2. CamlQuery Query2 = CamlQuery.CreateAllItemsQuery();
  3. Query2.ViewXml = string.Format("<View><Query></Query></View>");
  4. Microsoft.SharePoint.Client.ListItemCollection ContactsCollListItem = ContactDetailsList.GetItems(Query2);
  5. clientContext.Load(ContactsCollListItem);
  6. clientContext.ExecuteQuery();
  7. DataTable dtContacts = new DataTable("Contacts");
  8. dtContacts.Columns.Add("ID");
  9. dtContacts.Columns.Add("FirstName");
  10. dtContacts.Columns.Add("LastName");
  11. dtContacts.Columns.Add("Address");
  12. dtContacts.Columns.Add("PhoneNo");
  13. dtContacts.Columns.Add("Pincode");
  14. foreach (Microsoft.SharePoint.Client.ListItem item in ContactsCollListItem)
  15. {
  16. DataRow dr = dtContacts.NewRow();
  17. dr["ID"] = item["ID"];
  18. dr["FirstName"] = item["FirstName"];
  19. dr["LastName"] = item["LastName"];
  20. dr["Address"] = item["Address"];
  21. dr["PhoneNo"] = item["PhoneNo"];
  22. dr["Pincode"] = item["Pincode"];
  23. dtContacts.Rows.Add(dr);
  24. }
  25. grdContactDetails.DataSource = dtContacts;
  26. grdContactDetails.DataBind();
Step 2: Bind ProjectDetails Grid with List Data
  1. List ProjectDetailsList = clientContext.Web.Lists.GetByTitle("ProjectDetails");
  2. CamlQuery Query1 = CamlQuery.CreateAllItemsQuery();
  3. Query1.ViewXml = string.Format("<View><Query></Query></View>");
  4. Microsoft.SharePoint.Client.ListItemCollection ProjectCollListItem = ProjectDetailsList.GetItems(Query1);
  5. clientContext.Load(ProjectCollListItem);
  6. clientContext.ExecuteQuery();
  7. DataTable dtProjects = new DataTable("Projects");
  8. dtProjects.Columns.Add("Title");
  9. dtProjects.Columns.Add("ManagerID");
  10. foreach (Microsoft.SharePoint.Client.ListItem item in ProjectCollListItem)
  11. {
  12. DataRow dr = dtProjects.NewRow();
  13. FieldLookupValue Managerlkp = (FieldLookupValue)item["ManagerID"];
  14. dr["Title"] = item["Title"];
  15. dr["ManagerID"] = CheckLookupValue(Managerlkp);
  16. dtProjects.Rows.Add(dr);
  17. }
  18. grdProjectDetails.DataSource = dtProjects;
  19. grdProjectDetails.DataBind();
Step 3: Dynamic List Join Query Building
  1. CamlQuery camlQuery = CamlQuery.CreateAllItemsQuery();
  2. string QueryStr = "";
  3. string JoinQuery = "";
  4. string ViewdFieldsQuery = "";
  5. string ProjectedFieldsQuery = "";
  6. string joinListTitle = "ContactDetails";
  7. string joinFieldName = "ManagerID";
  8. /************** viewdFields ***************/
  9. string[] viewdFields = new string[] { "Title", "ManagerID", "FirstName", "LastName", "Address", "PhoneNo", "Pincode" };
  10. foreach (var f in viewdFields)
  11. {
  12. ViewdFieldsQuery += string.Format("<FieldRef Name='{0}' />", f);
  13. }
  14. /************** projectedFields ***************/
  15. string[] projectedFields = new string[] { "FirstName", "LastName", "Address", "PhoneNo", "Pincode" };
  16. foreach (var f in projectedFields)
  17. {
  18. ProjectedFieldsQuery += string.Format("<Field Name='{1}' Type='Lookup' List='{0}' ShowField='{1}' />", joinListTitle, f);
  19. }
  20. /******************* Joins ************************/
  21. //JoinQuery += "<Join Type='INNER' ListAlias='ContactDetails'>" +
  22. // "<Eq>" +
  23. // "<FieldRef Name='ManagerID' RefType='ID' />" +
  24. // "<FieldRef List='ContactDetails' Name='ID' />" +
  25. // "</Eq>" +
  26. // "</Join>";
  27. JoinQuery += "<Join Type='LEFT' ListAlias='" + joinListTitle + "'>" + // ContactDetails
  28. "<Eq>" +
  29. "<FieldRef Name='" + joinFieldName + "' RefType='ID' />" + // ManagerID
  30. "<FieldRef List='" + joinListTitle + "' Name='ID' />" + // ContactDetails
  31. "</Eq>" +
  32. "</Join>";
  33. /**************************************************/
  34. QueryStr = @"<View>" +
  35. "<ViewFields>" +
  36. ViewdFieldsQuery +
  37. "</ViewFields>" +
  38. "<Joins>" +
  39. JoinQuery +
  40. "</Joins>" +
  41. "<ProjectedFields>" +
  42. ProjectedFieldsQuery +
  43. "</ProjectedFields>" +
  44. "</View>";
  45. camlQuery.ViewXml = string.Format(QueryStr);
  46. List oList = clientContext.Web.Lists.GetByTitle("ProjectDetails");
  47. Microsoft.SharePoint.Client.ListItemCollection collListItem = oList.GetItems(camlQuery);
  48. clientContext.Load(collListItem);
  49. clientContext.ExecuteQuery();
  50. int itemcount = collListItem.Count;
  51. DataTable dt = new DataTable("Projects");
  52. dt.Columns.Add("Title");
  53. dt.Columns.Add("ManagerID");
  54. dt.Columns.Add("FirstName");
  55. dt.Columns.Add("LastName");
  56. dt.Columns.Add("Address");
  57. dt.Columns.Add("PhoneNo");
  58. dt.Columns.Add("Pincode");
  59. foreach (Microsoft.SharePoint.Client.ListItem item in collListItem)
  60. {
  61. DataRow dr = dt.NewRow();
  62. FieldLookupValue Managerlkp = (FieldLookupValue)item["ManagerID"];
  63. FieldLookupValue FNamelkp = (FieldLookupValue)item["FirstName"];
  64. FieldLookupValue LNamelkp = (FieldLookupValue)item["LastName"];
  65. FieldLookupValue Addresslkp = (FieldLookupValue)item["Address"];
  66. FieldLookupValue PhoneNolkp = (FieldLookupValue)item["PhoneNo"];
  67. FieldLookupValue Pincodelkp = (FieldLookupValue)item["Pincode"];
  68. dr["Title"] = item["Title"];
  69. dr["ManagerID"] = CheckLookupValue(Managerlkp);
  70. dr["FirstName"] = CheckLookupValue(FNamelkp);
  71. dr["LastName"] = CheckLookupValue(LNamelkp);
  72. dr["Address"] = CheckLookupValue(Addresslkp);
  73. dr["PhoneNo"] = CheckLookupValue(PhoneNolkp);
  74. dr["Pincode"] = CheckLookupValue(Pincodelkp);
  75. dt.Rows.Add(dr);
  76. }
  77. grdListJoin.DataSource = dt;
  78. grdListJoin.DataBind();
SharePoint Lookup value checking function
  1. public string CheckLookupValue(FieldLookupValue LookupField)
  2. {
  3. string Ans = "";
  4. if (LookupField == null)
  5. Ans = "";
  6. else
  7. Ans = LookupField.LookupValue;
  8. return Ans;
  9. }
Output
output

Source Code
  1. using Microsoft.SharePoint.Client;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. namespace CamlQueryWeb.Pages
  10. {
  11. public partial class ListJoins : System.Web.UI.Page
  12. {
  13. protected void Page_PreInit(object sender, EventArgs e)
  14. {
  15. Uri redirectUrl;
  16. switch (SharePointContextProvider.CheckRedirectionStatus(Context, out redirectUrl))
  17. {
  18. case RedirectionStatus.Ok:
  19. return;
  20. case RedirectionStatus.ShouldRedirect:
  21. Response.Redirect(redirectUrl.AbsoluteUri, endResponse: true);
  22. break;
  23. case RedirectionStatus.CanNotRedirect:
  24. Response.Write("An error occurred while processing your request.");
  25. Response.End();
  26. break;
  27. }
  28. }
  29. protected void Page_Load(object sender, EventArgs e)
  30. {
  31. // The following code gets the client context and Title property by using TokenHelper.
  32. // To access other properties, the app may need to request permissions on the host web.
  33. var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
  34. using (var clientContext = spContext.CreateUserClientContextForSPHost())
  35. {
  36. clientContext.Load(clientContext.Web, web => web.Title);
  37. clientContext.ExecuteQuery();
  38. Response.Write(clientContext.Web.Title);
  39. }
  40. JoinOperation();
  41. }
  42. public void JoinOperation()
  43. {
  44. var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
  45. using (var clientContext = spContext.CreateUserClientContextForSPHost())
  46. {
  47. List ContactDetailsList = clientContext.Web.Lists.GetByTitle("ContactDetails");
  48. CamlQuery Query2 = CamlQuery.CreateAllItemsQuery();
  49. Query2.ViewXml = string.Format("<View><Query></Query></View>");
  50. Microsoft.SharePoint.Client.ListItemCollection ContactsCollListItem = ContactDetailsList.GetItems(Query2);
  51. clientContext.Load(ContactsCollListItem);
  52. clientContext.ExecuteQuery();
  53. DataTable dtContacts = new DataTable("Contacts");
  54. dtContacts.Columns.Add("ID");
  55. dtContacts.Columns.Add("FirstName");
  56. dtContacts.Columns.Add("LastName");
  57. dtContacts.Columns.Add("Address");
  58. dtContacts.Columns.Add("PhoneNo");
  59. dtContacts.Columns.Add("Pincode");
  60. foreach (Microsoft.SharePoint.Client.ListItem item in ContactsCollListItem)
  61. {
  62. DataRow dr = dtContacts.NewRow();
  63. dr["ID"] = item["ID"];
  64. dr["FirstName"] = item["FirstName"];
  65. dr["LastName"] = item["LastName"];
  66. dr["Address"] = item["Address"];
  67. dr["PhoneNo"] = item["PhoneNo"];
  68. dr["Pincode"] = item["Pincode"];
  69. dtContacts.Rows.Add(dr);
  70. }
  71. grdContactDetails.DataSource = dtContacts;
  72. grdContactDetails.DataBind();
  73. /***********************************************************************/
  74. List ProjectDetailsList = clientContext.Web.Lists.GetByTitle("ProjectDetails");
  75. CamlQuery Query1 = CamlQuery.CreateAllItemsQuery();
  76. Query1.ViewXml = string.Format("<View><Query></Query></View>");
  77. Microsoft.SharePoint.Client.ListItemCollection ProjectCollListItem = ProjectDetailsList.GetItems(Query1);
  78. clientContext.Load(ProjectCollListItem);
  79. clientContext.ExecuteQuery();
  80. DataTable dtProjects = new DataTable("Projects");
  81. dtProjects.Columns.Add("Title");
  82. dtProjects.Columns.Add("ManagerID");
  83. foreach (Microsoft.SharePoint.Client.ListItem item in ProjectCollListItem)
  84. {
  85. DataRow dr = dtProjects.NewRow();
  86. FieldLookupValue Managerlkp = (FieldLookupValue)item["ManagerID"];
  87. dr["Title"] = item["Title"];
  88. dr["ManagerID"] = CheckLookupValue(Managerlkp);
  89. dtProjects.Rows.Add(dr);
  90. }
  91. grdProjectDetails.DataSource = dtProjects;
  92. grdProjectDetails.DataBind();
  93. /***********************************************************************/
  94. CamlQuery camlQuery = CamlQuery.CreateAllItemsQuery();
  95. string QueryStr = "";
  96. string JoinQuery = "";
  97. string ViewdFieldsQuery = "";
  98. string ProjectedFieldsQuery = "";
  99. string joinListTitle = "ContactDetails";
  100. string joinFieldName = "ManagerID";
  101. /************** viewdFields ***************/
  102. string[] viewdFields = new string[] { "Title", "ManagerID", "FirstName", "LastName", "Address", "PhoneNo", "Pincode" };
  103. foreach (var f in viewdFields)
  104. {
  105. ViewdFieldsQuery += string.Format("<FieldRef Name='{0}' />", f);
  106. }
  107. /************** projectedFields ***************/
  108. string[] projectedFields = new string[] { "FirstName", "LastName", "Address", "PhoneNo", "Pincode" };
  109. foreach (var f in projectedFields)
  110. {
  111. ProjectedFieldsQuery += string.Format("<Field Name='{1}' Type='Lookup' List='{0}' ShowField='{1}' />", joinListTitle, f);
  112. }
  113. /******************* Joins ************************/
  114. //JoinQuery += "<Join Type='INNER' ListAlias='ContactDetails'>" +
  115. // "<Eq>" +
  116. // "<FieldRef Name='ManagerID' RefType='ID' />" +
  117. // "<FieldRef List='ContactDetails' Name='ID' />" +
  118. // "</Eq>" +
  119. // "</Join>";
  120. JoinQuery += "<Join Type='LEFT' ListAlias='" + joinListTitle + "'>" + // ContactDetails
  121. "<Eq>" +
  122. "<FieldRef Name='" + joinFieldName + "' RefType='ID' />" + // ManagerID
  123. "<FieldRef List='" + joinListTitle + "' Name='ID' />" + // ContactDetails
  124. "</Eq>" +
  125. "</Join>";
  126. /**************************************************/
  127. QueryStr = @"<View>" +
  128. "<ViewFields>" +
  129. ViewdFieldsQuery +
  130. "</ViewFields>" +
  131. "<Joins>" +
  132. JoinQuery +
  133. "</Joins>" +
  134. "<ProjectedFields>" +
  135. ProjectedFieldsQuery +
  136. "</ProjectedFields>" +
  137. "</View>";
  138. camlQuery.ViewXml = string.Format(QueryStr);
  139. List oList = clientContext.Web.Lists.GetByTitle("ProjectDetails");
  140. Microsoft.SharePoint.Client.ListItemCollection collListItem = oList.GetItems(camlQuery);
  141. clientContext.Load(collListItem);
  142. clientContext.ExecuteQuery();
  143. int itemcount = collListItem.Count;
  144. DataTable dt = new DataTable("Projects");
  145. dt.Columns.Add("Title");
  146. dt.Columns.Add("ManagerID");
  147. dt.Columns.Add("FirstName");
  148. dt.Columns.Add("LastName");
  149. dt.Columns.Add("Address");
  150. dt.Columns.Add("PhoneNo");
  151. dt.Columns.Add("Pincode");
  152. foreach (Microsoft.SharePoint.Client.ListItem item in collListItem)
  153. {
  154. DataRow dr = dt.NewRow();
  155. FieldLookupValue Managerlkp = (FieldLookupValue)item["ManagerID"];
  156. FieldLookupValue FNamelkp = (FieldLookupValue)item["FirstName"];
  157. FieldLookupValue LNamelkp = (FieldLookupValue)item["LastName"];
  158. FieldLookupValue Addresslkp = (FieldLookupValue)item["Address"];
  159. FieldLookupValue PhoneNolkp = (FieldLookupValue)item["PhoneNo"];
  160. FieldLookupValue Pincodelkp = (FieldLookupValue)item["Pincode"];
  161. dr["Title"] = item["Title"];
  162. dr["ManagerID"] = CheckLookupValue(Managerlkp);
  163. dr["FirstName"] = CheckLookupValue(FNamelkp);
  164. dr["LastName"] = CheckLookupValue(LNamelkp);
  165. dr["Address"] = CheckLookupValue(Addresslkp);
  166. dr["PhoneNo"] = CheckLookupValue(PhoneNolkp);
  167. dr["Pincode"] = CheckLookupValue(Pincodelkp);
  168. dt.Rows.Add(dr);
  169. }
  170. grdListJoin.DataSource = dt;
  171. grdListJoin.DataBind();
  172. //Label1.Text = Convert.ToString(itemcount);
  173. };
  174. }
  175. public string CheckLookupValue(FieldLookupValue LookupField)
  176. {
  177. string Ans = "";
  178. if (LookupField == null)
  179. Ans = "";
  180. else
  181. Ans = LookupField.LookupValue;
  182. return Ans;
  183. }
  184. }
  185. }
Thank you! Please mention your queries if you have any in the comments section below.