SharePoint Joins

  • Only Inner & Left joins are permitted.
  • Joins can only be defined on lookup columns.
  • Projected fields cannot be used to sort in the view.

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.