엔티티 프레임 워크 (ef)를 사용 중이고 다음과 같은 오류가 발생합니다.
"쿼리 결과를 두 번 이상 열거 할 수 없습니다."
ef 데이터 컨텍스트가 포함 된 저장소 클래스가 있습니다. 그런 다음 컨트롤러 클래스 (MVC 컨트롤러와 혼동하지 말 것)에 저장소 인스턴스가 포함되어 있습니다. 지금까지는 그렇게 좋았습니다 ... 컨트롤러에 배열을 반환해야하는 검색 방법이 있습니다.RadComboBoxItemData
Telerik RadComboBox 컨트롤을 채우는 데 사용됩니다.
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();
}
내 코드를 디버깅 할 때 foreach 루프가 발생할 수 있지만 다음 오류 메시지가 나타납니다.
유형의 예외 'System.InvalidOperationException' System.Data.Entity.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다.
추가 정보 : 쿼리를 열거 할 수 없습니다. 일단.
내 엔티티는 기존 내장 프로 시저의 함수 가져 오기를 사용합니다.
// 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);
}
함수 가져 오기Search
저장된 전제를 호출하여 컬렉션을 반환합니다.SearchItem
.
foreach 루프가 ef와 함께 무언가 때문에 반복 할 수 없다는 느낌이 들었습니다.
호출하여 결과를 명시 적으로 열거 해보십시오.ToList()
.
변화
foreach (var item in query)
에
foreach (var item in query.ToList())
ToList
이 목록의 데이터베이스에서 모든 결과를 검색하고 있습니다. 이제 linq 메소드가 데이터베이스에서 작업하지 않습니다. 이는 보유하고있는 데이터의 양과 수행 할 작업에 따라 심각한 성능 문제가 될 수 있습니다. - BrunoLMquery
변하기 쉬운. 솔루션에 문제가있을뿐만 아니라 OP 문제를 해결할 수있는 최선의 방법이기도합니다. downvote를 설명하는 배려? - Yakimych.ToList()
작품은 당신이IEnumerable, 컬렉션은게으른방법. 이 경우, 매회각각루프는 항목을 가져오고, 쿼리는 사용중인 모든 항목을 데이터베이스에서 가져옵니다. 다시 반복하려면 쿼리를 다시 실행할 수 없습니다. 사용하면.ToList()
,에있는 모든 항목IEnumerable처리되어 목록으로 저장됩니다. 그런 다음 원하는만큼 여러 번 생성 된 목록을 사용할 수 있습니다. - Vicro
이것을 바꾸어보십시오.
var query = context.Search(id, searchText);
와
var query = context.Search(id, searchText).tolist();
모든 것이 잘 작동 할 것입니다.
이런 종류의 오류가 발생하면 proc 데이터를 일반적인 목록으로 저장 한 다음 다른 컨트롤을 바인딩하는 것이 좋습니다.이 오류가 발생하므로이 문제를 해결했습니다. 전의:-
repeater.DataSource = data.SPBinsReport().Tolist();
repeater.DataBind();
이렇게 해봐.