1

LinqtoSqlでアクセスしている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

データを複数回列挙しようとしています - で 1 回、foreach次に.ToList()for each matchingUserGuidでもう一度、エラーの原因となっています。

おそらく、この LINQ select ステートメントが役立ちます。

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

IQueryable を呼び出す.ToListと、それが具体化されます (つまり、クエリがバックエンド プロバイダーに渡されます)。明らかに、これはコストのかかる操作になる可能性が高いため、1 回だけ実行することをお勧めします。これは、エラーが伝えようとしていることです。

一度だけ呼び出し.ToListて結果を保存すれば、問題は解決するはずです。

于 2013-03-11T14:16:30.250 に答える