【问题标题】:'The Query Results cannot be enumerated more than once''查询结果不能多​​次列举'
【发布时间】:2013-03-11 14:12:15
【问题描述】:

我有一个使用 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();

【问题讨论】:

  • 我整理了你的代码,因为你把它像狗的晚餐一样呈现出来。也许您可能缺少大括号,但我不想假设。目前尚不清楚最后一段代码与您的问题有何关系。

标签: c# wpf linq


【解决方案1】:

您尝试多次枚举数据 - 一次在 foreach 中,然后再次使用 .ToList() 为每个匹配的 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();
}

【讨论】:

  • +1 用于展示如何调整查询以使其返回正确的结果,而不是仅将 ToList 添加到 OP 的查询中并在内存中对其进行过滤。尽管请注意他不只是执行查询两次,而是执行一次,加上每个匹配的 UserGuid 的额外时间,这可能是很多次。
【解决方案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;
        }
    }

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多