【问题标题】:LinqDataSource: Filtering and binding to gridviewLinqDataSource:过滤并绑定到gridview
【发布时间】:2010-07-28 16:45:41
【问题描述】:

问题没有按照我想要的方式解决,但我继续感谢:ŁukaszW.pl 他的时间和精力。

我正在使用 gridview 控件和 linqdatasource,它一切正常,我添加了 searchBySubject 的功能,我添加了 WhereParameters,而不是绑定我的 gridview(参见下面的代码),但不知何故它没有返回任何行,我看到了根据我正在搜索的内容获得行数。

 protected void btnSearch_Click(object sender, EventArgs e)
 {    
   this.LinqDataSource1.WhereParameters["Subject"].DefaultValue = this.txtSubject.Text;
   this.GridView1.DataBind();
 }

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"  
         DataSourceID="LinqDataSource1"  
        EmptyDataText="There are no data records to display."> 
        <Columns> 
            <asp:BoundField DataField="UserID" HeaderText="UserID" ReadOnly="True"  
                SortExpression="UserID" /> 
            <asp:BoundField DataField="Username" HeaderText="Username"  
                SortExpression="Username" /> 
            <asp:BoundField DataField="FirstName" HeaderText="FirstName"  
                SortExpression="FirstName" /> 
            <asp:BoundField DataField="LastName" HeaderText="LastName"  
                SortExpression="LastName" /> 
            <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" /> 
        </Columns> 
    </asp:GridView> 

     <asp:LinqDataSource ID="LinqDataSource1" runat="server"  
        ContextTypeName="MyDataContextDataContext" 
        onselecting="LinqDataSource_Selecting" > 
            <WhereParameters> 
               <asp:Parameter Name="Subject" />
            </WhereParameters> 
        </asp:LinqDataSource>



public List<Reporter> GetInquiries()
        {
            using (MyDataContextDataContext dc = conn.GetContext())
            {
                var loadAll = (from spName in dc.spReporter()
                               select spName);

                List<Reporter> reporterList = new List<Reporter>();

                foreach (var item in loadAll)
                {
                    reporterList.Add(new Reporter(item.Id, item.InqDate, item.Subject));
                }                

                return reporterList;
            }      

错误:

 The query results cannot be enumerated more than once

【问题讨论】:

    标签: c# asp.net linqdatasource


    【解决方案1】:

    假设您在页面中声明了这样的LinqDataSource

    <asp:LinqDataSource ID="LinqDataSource1"
                        runat="server"  
                        ContextTypeName="MyDataContext"
                        OnSelecting="LinqDataSource1_Selecting">
        <WhereParameters>
            <asp:ControlParameter Name="Subject"
                                  ControlID="txtSubject"
                                  PropertyName="Text"
                                  Type="String" />
        </WhereParameters>
    </asp:LinqDataSource>
    

    您的LinqDataSource.Selecting 事件处理程序应大致如下所示:

    public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
         var db = new MyDataContext())
         var subjectFilter = e.WhereParameters("Subject");
         var reporters = from spName in db.spReporter()
                         where spName.Subject.Contains(subjectFilter)
                         select new Reporter(spName.Id, spName.InqDate, spName.Subject);
         e.Result = reporters;
    }
    

    或者您可以将“主题”作为输入参数添加到存储过程和数据库中的过滤。在这种情况下,事件处理程序将如下所示:

    public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
         var db = new MyDataContext())
         var subjectFilter = e.WhereParameters("Subject");
         var reporters = from spName in db.spReporter(subjectFilter)
                         select new Reporter(spName.Id, spName.InqDate, spName.Subject);
         e.Result = reporters;
    }
    

    相关资源:

    【讨论】:

      【解决方案2】:

      关于这个问题,我看不到您的 GetInquiries 方法和 LinqDataSource 之间有任何联系。第一,第二是即使有连接,如果你返回列表,它也不会工作,而不是 IQueriable 对象......

      为了更好地理解与 LinqDataSource 的绑定,请阅读 this Scott Gu's article

      我还想告诉你,你的 GetInquiries 方法可以简化为这种形式:

          public List<Reporter> GetInquiries()
          {
              using (MyDataContextDataContext dc = conn.GetContext())
              {
                  return (from spName in dc.spReporter()
                          select new Reporter(spName.Id, spName.InqDate, spName.Subject)).ToList()
      
              }      
      

      ----已编辑----

      替代解决方案示例:

          public List<Reporter> GetInquiries(string subject)
          {
              using (MyDataContextDataContext dc = conn.GetContext())
              {
                  return (from spName in dc.spReporter()
                          select new Reporter(spName.Id, spName.InqDate, spName.Subject
                          where spName.Subject == subject)).ToList()
      
              }  
          }
      
          protected void btnSearch_Click(object sender, EventArgs e)
          {    
             GridView1.DataSource = GetInquiries(txtSubject.Text);
             GridView1.DataBind();
          }
      

      --------- 编辑 -------------

      protected void btnSearch_Click(object sender, EventArgs e)
      {    
         this.LinqDataSource1.WhereParameters["Subject"].DefaultValue = this.txtSubject.Text;
         this.GridView1.DataBind();
      }
      
      public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
      { 
          ReporterRepository reporterRepo = new ReporterRepository();
          e.Result = reporterRepo.GetInquiries();    
      }
      
      public IQueryable<Reporter> GetInquiries()
      {
          return from spName in dc.spReporter()
                 select new Reporter(spName.Id, spName.InqDate, spName.Subject);
      }     
      
      <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="LinqDataSource1" EmptyDataText="There are no data records to display."> 
              <Columns> 
                  <asp:BoundField DataField="UserID" HeaderText="UserID" ReadOnly="True"  
                      SortExpression="UserID" /> 
                  <asp:BoundField DataField="Username" HeaderText="Username"  
                      SortExpression="Username" /> 
                  <asp:BoundField DataField="FirstName" HeaderText="FirstName"  
                      SortExpression="FirstName" /> 
                  <asp:BoundField DataField="LastName" HeaderText="LastName"  
                      SortExpression="LastName" /> 
                  <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" /> 
              </Columns> 
      </asp:GridView> 
      
      <asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="MyDataContextDataContext" onselecting="LinqDataSource_Selecting"> 
              <WhereParameters> 
                 <asp:Parameter Name="Subject" />
              </WhereParameters> 
      </asp:LinqDataSource>
      

      问候

      【讨论】:

      • 感谢您的建议...您的意思是返回 IQueriable 对象,您能告诉我几行吗?或者我在想我应该在 GetInquiries() 中添加 where 子句,还是因为我在 linqdatasource 中添加 where 子句,它会自动处理?
      • 现在我认为,没有必要使用 LinqDataSource... 只需使用 GetInquiries 方法获取 Reporters 列表,然后将其作为普通 DataSource 分配给您的 gridView。上面的例子。
      • 哎呀,对不起,我更新了(LinqDataSource_Selecting)问题
      • 哈哈.. 现在更有意义了.. 尝试返回返回纯 IQuerable(没有 ToList 方法)的 GetInquiries,或者如果它不起作用,请尝试我的替代解决方案:)
      • 我曾考虑过使用您在发布此问题之前提出的替代解决方案,但后来我认为这太过分了,因为我有 7 个项目需要过滤(按日期、按主题、按状态。 ....)
      猜你喜欢
      • 2011-12-31
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      相关资源
      最近更新 更多