The result of a query cannot be enumerated more than once

C#asp.netLinqEntity FrameworkEntity Framework-4

C# Problem Overview


I am using the entity framework (ef) and am getting the following error:

> "The result of a query cannot be enumerated more than once.".

I have a repository class which contains the ef data context. I then have a controller class (not to be confused with MVC controllers) which contains an instance of the repository. So far so good... I have a search method on the controller which is supposed to return an array of RadComboBoxItemData, which is used to populate a Telerik RadComboBox control.

public RadComboBoxItemData[] Search(int id, string searchText)
{
	var query = context.Search(id, searchText);
	List<RadComboBoxItemData> result = new List<RadComboBoxItemData>();
	foreach (var item in query)
	{
		RadComboBoxItemData itemData = new RadComboBoxItemData();
		itemData.Text = ""; // assign some text here..;
		itemData.Value = ""; /*assign some value here..*/
		result.Add(itemData);
	}

	return result.ToArray();
}

When I debug my code, I can get into the foreach loop, but then I get an error saying:

> An exception of type > 'System.InvalidOperationException' > occurred in System.Data.Entity.dll but > was not handled in user code > > Additional information: The result of > a query cannot be enumerated more than > once.

My entity uses a function import of an existing stored proc.

// EF repository method calling the function imported method on the data context.
public IEnumerable<SearchItem> Search(int id, string searchText)
{
	return this.entityContext.Search(id, searchText);
}

The function import Search calls a stored precedure to return a collection of SearchItem.

I have a feeling that the foreach loop can't iterate because of something with the ef.

C# Solutions


Solution 1 - C#

Try explicitly enumerating the results by calling ToList().

Change

foreach (var item in query)

to

foreach (var item in query.ToList())

Solution 2 - C#

Try replacing this

var query = context.Search(id, searchText);

with

var query = context.Search(id, searchText).tolist();

and everything will work well.

Solution 3 - C#

Problematic code calling an stored procedure:

var resultSP = db.StoredProcedure(id);

if (resultSP != null)
{
	var count = resultSP.Count();
	
	var list = resultSP.Select(x=>...);
}

Fixed, store in a variable with ToList() and reuse it:

var resultSP = db.StoredProcedure(id);

if (resultSP != null)
{
	var resultSP_List = resultSP.ToList();
	
	var count = resultSP_List.Count();
	
	var list = resultSP_List.Select(x=>...);
}

Solution 4 - C#

if you getting this type of error so I suggest you used to stored proc data as usual list then binding the other controls because I also get this error so I solved it like this ex:-

repeater.DataSource = data.SPBinsReport().Tolist();
repeater.DataBind();

try like this

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHalcyonView Question on Stackoverflow
Solution 1 - C#YakimychView Answer on Stackoverflow
Solution 2 - C#hosam hemailyView Answer on Stackoverflow
Solution 3 - C#DaniView Answer on Stackoverflow
Solution 4 - C#rishi kaithwasView Answer on Stackoverflow