我有一个sql server程序我正在使用Linq访问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();
}
}
此方法将返回每个结果,但我想返回guids匹配的结果。
谢谢!
Data.Database.FRCDatabaseDatacontext context =
new Data.Database.FRCDatabaseDatacontext();
var result = context.GetSearchProcedure(txtName.Text);
lstName.ItemsSource = result.ToList();
答案 0 :(得分:5)
您尝试多次枚举数据 - 一次在foreach
中,然后再次使用.ToList()
查找每个匹配的UserGuid
,这会导致错误。
也许这个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();
}
答案 1 :(得分: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;
}
}
无论如何,最好将参数传递给过程而不是在代码中重新计算它
答案 2 :(得分:1)
在IQueryable上调用.ToList
会导致它被实现(即查询被传递给后端提供者)。显然,这是你可能只想做一次的事情,因为这可能是一项昂贵的操作。这就是错误试图告诉你的。
如果您只调用.ToList
一次并存储结果,则问题应该消失。