演练:使用 LINQ 查询数据填充网格控件

上次修改时间: 2015年3月9日

适用范围: SharePoint Foundation 2010

本演练演示如何使用简单 LINQ to SharePoint 查询获取两个不同列表中的选定数据字段。该数据在 Web 部件中表示为网格控件。有关使用 LINQ to SharePoint 查询的概述,请参阅如何:使用 LINQ to SharePoint 进行查询

先决条件

  • 确保指向 SPMetal 工具的路径是 %PATH% 环境变量的一部分。有关详细信息,请参阅如何:向 PATH 环境变量中添加工具位置

  • 创建名为 Contoso 的 Microsoft SharePoint Foundation 网站。此演练的其余部分(包括代码和标记)假定使用此名称。

  • 在该网站上创建两个列表,名称分别为"员工"和"项目"。默认"标题"列将自动显示在每个列表中。向列表中添加列,如下表所示。

    "员工"列表

    列名称

    列类型

    备注

    职务

    单行文本

    工作组

    单行文本

    项目

    查阅

    查阅"项目"列表的"标题"列。

    项目列表:

    列名称

    列类型

    备注

    说明

    单行文本

    到期日期

    日期和时间

    主要联系人

    查阅

    查阅"员工"列表的"标题"列。

  • 使用一些列表项示例填充这两个列表。使用"员工"列表的"标题"字段保存员工姓名。使用"项目"列表的"标题"字段保存项目的名称。一些项目的到期日期应短于 6 个月,其他项目应长于 6 个月(均从现在算起)。

设置项目

  1. 在 Microsoft Visual Studio 中,启动一个 Web 部件项目,方法是从"新建项目"对话框中"已安装的模板"区域的"SharePoint"|"2010"部分选择"可视 Web 部件"。将该项目命名为 ProjectsWithContacts,然后单击"确定"。将打开"SharePoint 自定义向导"。

  2. 将 Contoso 网站指定为调试网站,并指定您想要部署服务器场解决方案,而不是沙盒解决方案。单击"完成"。

  3. 在"解决方案资源管理器"中,右键单击"引用"节点,然后单击"添加引用"。在"添加引用"对话框中的".NET"选项卡上,选择"Microsoft.SharePoint.Linq"。(单击"组件名称"栏按字母顺序排列组件列表可能会有所帮助。)单击"确定"。

  4. 右键单击"解决方案资源管理器"中的项目名称并选择"属性"。

  5. 在"属性"对话框的"应用程序"选项卡上,输入 Contoso.SharePoint.WebPartPages.ProjectsByContact 作为"程序集名称",输入 Contoso.SharePoint.WebPartPages 作为"默认命名空间"。将"目标框架"设置为 .NET Framework 3.5。

    重要注释重要信息

    对于基于"已安装的模板"的"SharePoint"|"2010"部分中的任何模板的项目,默认"目标框架"是 .NET Framework 3.5。不要更改此设置。Visual Studio"标准菜单"上"解决方案平台"框的默认值是"任何 CPU"。您可以使用"属性"对话框的"生成"选项卡上的"平台目标"下拉列表将此值更改为"x64"。有关进行选择的信息,请参阅如何:设置正确的目标框架和 CPU

  6. 在工具栏上单击"保存所有文件"按钮。

  7. 要自动使用 SPMetal 工具,请将一个名为 Prebuild.bat 的文本文件添加到项目中。

  8. 如果 Prebuild.bat 尚未打开,请打开该文件。添加以下各行。

    Echo Off
    SET SPLANGEXT=cs
    
    Echo Backing up previous version of generated code ... 
    IF NOT EXIST .\PreviousVersionGeneratedCode MkDir .\PreviousVersionGeneratedCode
    IF EXIST Contoso.%SPLANGEXT% xcopy /Y/V Contoso.%SPLANGEXT% .\PreviousVersionGeneratedCode
    
    Echo Generating code ...
    SPMetal /web:http://MyServer/Contoso /code:Contoso.%SPLANGEXT%
    

    根据需要对代码进行以下更改:

    • 将"MyServer/Contoso"替换为指向 Contoso 网站的完整路径。

    此批处理文件会保存生成的代码的以前版本,以便您在需要调试时可以将其与新版本进行比较。

  9. 保存该文件,但不要 通过以下方式保存该文件:单击工具栏上的"保存"或"保存所有文件"按钮,或者从"文件"菜单中选择"保存"。在 Visual Studio 中,文本文件的默认编码与系统批处理文件不兼容。请改为从"文件"菜单中选择"将 Prebuild.bat 另存为"。在"将文件另存为"对话框中,单击"保存"按钮上的向下箭头。选择"编码保存"。在"高级保存选项"对话框中,选择"编码"下拉列表中的"Unicode (UTF-8 无签名) - 代码页 65001",然后单击"确定"。确保选择 UTF-8 的"无签名"版本。

    提示提示

    如果以错误的方式意外保存了该文件,请重新打开它,稍做更改(例如添加一个空格),然后以正确的方式重新保存。如果不进行更改,则实际上不会重新保存该文件。

  10. 右键单击"解决方案资源管理器"中的项目名称。选择"属性"并打开"生成事件"选项卡。

  11. 在"预先生成事件命令行"(而非"后生成事件命令行")框中,输入以下两行。

    cd $(ProjectDir)
    Prebuild.bat
    

    单击"全部保存"按钮。

  12. 在"生成"菜单上选择"生成解决方案"。这将调用您的批处理文件,即 SPMetal。SPMetal 将在 Windows 中的项目目录中创建一个 Contoso.cs 文件,但不在"解决方案资源管理器"中创建该文件。将其作为"现有项"添加到项目中。

    每次重新生成项目时,都会重新生成 Contoso.cs。尽管对于本演练,并不需要重新生成该文件,但在使用 SPMetal 时最好这样做,因为它可确保 Contoso.cs 文件能够反映对列表所做的更改,添加到网站中的新列表的添加操作以及从网站中删除列表的操作。

创建代码和标记

  1. 在"解决方案资源管理器"中,展开"VisualWebPart1"节点,然后打开 VisualWebPart1.webpart 文件。

  2. 将 Title 属性的值设置为"按主要联系人列出的项目"。

  3. 将 Description 属性的值设置为"将在 6 个月内到期且按主要联系人列出的项目"。

  4. 单击工具栏上的"保存"按钮。

  5. 打开 VisualWebPart1UserControl.ascx 文件并在现有指令的下方添加以下标记。

    <%@ Import Namespace="Microsoft.SharePoint.WebControls" %>
    
    <SharePoint:SPGridView id="spGridView" runat="server" AutoGenerateColumns="false">
      <HeaderStyle HorizontalAlign="Left" ForeColor="Navy" Font-Bold="true" />
      <Columns>
        <SharePoint:SPBoundField DataField="Title" HeaderText="Employee">
          <headerstyle HorizontalAlign="Left" />
        </SharePoint:SPBoundField>
        <SharePoint:SPBoundField DataField="JobTitle" HeaderText="Job Title">
          <headerstyle HorizontalAlign="Left" />
        </SharePoint:SPBoundField>
        <SharePoint:SPBoundField DataField="ProjectTitle" HeaderText="Project Title">
          <headerstyle HorizontalAlign="Left" />
        </SharePoint:SPBoundField>
        <SharePoint:SPBoundField DataField="DueDate" HeaderText="Due Date">
          <headerstyle HorizontalAlign="Left" />
        </SharePoint:SPBoundField>
      </Columns>
    </SharePoint:SPGridView>
    
  6. 单击工具栏上的"保存"按钮。

  7. 在"解决方案资源管理器"中,展开"VisualWebPart1UserControl.ascx"节点,然后打开 VisualWebPart1UserControl.ascx.cs 代码隐藏文件。

  8. 添加以下 using 语句。

    using System.Linq;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Linq;
    
  9. Page_Load 方法替换为以下内容。注意,表达式 emp.Project.DueDate 和 emp.Project.Title 会在"员工"和"项目"列表之间创建隐式连接。另请注意,select 语句仅指定将真正显示在 Web 部件中的字段。不需要通过网络将每个项目项的"说明"字段从内容数据库发送到前端 Web 服务器。

    protected void Page_Load(object sender, EventArgs e)
    {
        using (ContosoDataContext dc = new ContosoDataContext(SPContext.Current.Web.Url))
        {
            EntityList<EmployeesItem> Employees =
            dc.GetList<EmployeesItem>("Employees");
    
            var empQuery = from emp in Employees
                           where emp.Project.DueDate < DateTime.Now.AddMonths(6)
                           select new
                           {
                               emp.Title,
                               emp.JobTitle,
                               ProjectTitle = emp.Project.Title,
                               DueDate = emp.Project.DueDate.Value.ToShortDateString()
                            };
    
            spGridView.DataSource = empQuery;
            spGridView.DataBind();
        }
    }
    
  10. 单击工具栏上的"保存"按钮。

部署和测试 Web 部件

  1. 在"生成"菜单上选择"部署解决方案"。部署过程将执行以下操作:

    • 运行批处理文件(即 SPMetal)

    • 生成项目

    • 将 ProjectsWithContacts.wsp 包文件部署到场解决方案库

    • 将 Contoso.SharePoint.WebPartPages.ProjectsByContact.dll 程序集部署到全局程序集缓存

    • 将"ProjectsWithContacts Feature1"功能添加到网站集的功能库中

    • 激活该功能

    • 回收 Internet Information Services (IIS)

    在对项目自动进行更改后再次选择"部署解决方案"时,会收回解决方案的以前版本,并将其替换为最新版本。

  2. 导航到网站上的任意 Web 部件页,并单击功能区上的"页面"选项卡。

  3. 单击"编辑页面",然后单击任意 Web 部件区域中的"添加 Web 部件"。

  4. 在"类别"框中,单击"自定义"文件夹,单击"Web 部件"框中的"按主要联系人列出的项目",然后单击"添加"。

  5. 单击"停止编辑"。验证该 Web 部件是否显示在页面上,且其中填充了两个列表中的数据。到期日期长于从现在算起的 6 个月的项目不会显示。

请参阅

任务

如何:使用 SPMetal

概念

如何:使用 LINQ to SharePoint 进行查询

如何:向 PATH 环境变量中添加工具位置

其他资源

使用 LINQ to SharePoint 管理数据