2017-02-22 20 views
0

我有一个listview对话框来将数据绑定到该列表视图。查询的结果不能枚举多次。

private void BindListView(string DCLookupMstr_Value, int reportCatId, string DCLookup_Value = null) 

    {   

     using (Model.OperationalAnalyticsEntities oadb = new Model.OperationalAnalyticsEntities()) 
      { 
       var res = oadb.prGetDailyCensusLookup(DCLookupMstr_Value, reportCatId, DCLookup_Value); 
       Session["LookupValues"] = res; 
       lvLookup.DataSource = res.ToList(); 
       lvLookup.DataBind(); 
      }    
    } 

而且我在该列表视图对话框中放置了一个搜索框(文本框)。如果用户输入任何文本/字符,使用LINQ查询......再次使用包含给定字符的值填充列表视图。我的代码如下

protected void txtSearch_TextChanged(object sender, EventArgs e) 
    { 
     var text = txtSearch.Text; 
     //var list = new List<Model.prGetDailyCensusLookup_Result>(); 
     var lookUpValue = Session["LookupValues"] as ObjectResult<Model.prGetDailyCensusLookup_Result>; 
     var list = lookUpValue.Where(x => x.DCLookup_Value.Contains(text)); 

     lvLookup.DataSource = list.ToList(); 
     lvLookup.DataBind(); 
    } 

我得到的“查询结果不能枚举不止一次”在以往任何时候我加入.ToList()。我不确定我错过了什么。

请帮忙!

+1

错误消息是不言自明的。您正尝试多次获取查询的结果。你不能那样做。那你觉得怎么样?您还试图执行基于处置数据源的查询,因此这很可能也会给您带来问题。 – Servy

回答

1

BindListView中,当您做.ToList()时,它首次枚举查询。你在会话中存储的是查询本身。当您再次在txtSearch_TextChanged中执行.ToList()时,它会再次枚举该查询,但不支持该查询。

你应该的.ToList()结果存储在会话中,而不是查询:

Session["LookupValues"] = lvLookup.DataSource = res.ToList(); 
+0

谢谢!您的解决方案解决了我的问题。 @Thomas – crony

0

你珍惜你存储在Session是LINQ查询,而不是查询的结果。第二次使用它(list.ToList())它会引发此错误。

这可以通过将结果作为列表存储在Session中而轻松解决。

var res = oadb.prGetDailyCensusLookup(DCLookupMstr_Value, reportCatId, DCLookup_Value) 
       .ToList(); 
Session["LookupValues"] = res; 
lvLookup.DataSource = res; 
lvLookup.DataBind();