1

我有一个使用 Linq to Sql 访问的 sql 服务器过程。当我执行查询时,我收到错误“查询结果不能多​​次枚举”。在 txtName 文本框中输入参数,结果显示在 lstName 列表视图中。

 public void GetSearchString()
 {
     Data.Database.FRCDatabaseDatacontext context = 
         new Data.Database.FRCDatabaseDatacontext();
     var result = context.GetSearchProcedure(txtName.Text);
     foreach (GetSearchProcedureResult search in result)
         if ( search.UserGuid == 
               Workspace.Instance.ActiveUser.CurrentUserActiveDirectoryGuid)
         {
             lstName.ItemsSource = result.ToList();
         }
 }

此方法将返回每个结果,但我想返回 guid 匹配的结果。

谢谢!

Data.Database.FRCDatabaseDatacontext context = 
    new Data.Database.FRCDatabaseDatacontext();
var result = context.GetSearchProcedure(txtName.Text);
lstName.ItemsSource = result.ToList();
4

3 回答 3

5

您正在尝试多次枚举数据 - 一次在 中foreach,然后再次使用.ToList()for each match UserGuid,这会导致错误。

也许这个 LINQ 选择语句会有所帮助:

public void GetSearchString()
{
    Data.Database.FRCDatabaseDatacontext context = new Data.Database.FRCDatabaseDatacontext();

    lstName.ItemsSource = (from s in context.GetSearchProcedure(txtName.Text) 
                  where s.UserGuid == Workspace.Instance.ActiveUser.CurrentUserActiveDirectoryGuid
                  select s).ToList();
}
于 2013-03-11T14:22:51.483 回答
2
public void GetSearchString()
  {
      var context = new Data.Database.FRCDatabaseDatacontext();
      var result = context.GetSearchProcedure(txtName.Text);
      var itemSource = result.ToList();

        foreach (GetSearchProcedureResult search in itemSource)
        if (search.UserGuid == Workspace.Instance.ActiveUser.CurrentUserActiveDirectoryGuid)
        {
            lstName.ItemsSource = itemSource;
        }
    }

无论如何,最好将参数传递给过程,而不是在代码中重新计算它

于 2013-03-11T14:16:23.447 回答
1

调用.ToListIQueryable 会导致它被具体化(即,查询被传递给后端提供者)。显然,这可能是您宁愿只做一次的事情,因为这可能是一项昂贵的操作。这就是错误试图告诉你的。

如果您只调用.ToList一次并存储结果,问题应该会消失。

于 2013-03-11T14:16:30.250 回答