63

엔티티 프레임 워크 (ef)를 사용 중이고 다음과 같은 오류가 발생합니다.

"쿼리 결과를 두 번 이상 열거 할 수 없습니다."

ef 데이터 컨텍스트가 포함 된 저장소 클래스가 있습니다. 그런 다음 컨트롤러 클래스 (MVC 컨트롤러와 혼동하지 말 것)에 저장소 인스턴스가 포함되어 있습니다. 지금까지는 그렇게 좋았습니다 ... 컨트롤러에 배열을 반환해야하는 검색 방법이 있습니다.RadComboBoxItemDataTelerik 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 ()가 누락되었습니다. 어디서 볼 수 없는지 ... 커피를 들고 다시 한 번보세요. - Smudge202

3 답변


126

호출하여 결과를 명시 적으로 열거 해보십시오.ToList().

변화

foreach (var item in query)

foreach (var item in query.ToList())


  • 그게 효과가 있었어! 왜 작동하는지 설명해 주시겠습니까? - Halcyon
  • @Halcyon 사용하기 때문에 작동합니다.ToList이 목록의 데이터베이스에서 모든 결과를 검색하고 있습니다. 이제 linq 메소드가 데이터베이스에서 작업하지 않습니다. 이는 보유하고있는 데이터의 양과 수행 할 작업에 따라 심각한 성능 문제가 될 수 있습니다. - BrunoLM
  • @BrunoLM -이 경우 OP는 이미 모든 쿼리 결과를 반복합니다. 보다 많은 "linq 방법" 데이터베이스에 대해 실행해야하며 계속해서query변하기 쉬운. 솔루션에 문제가있을뿐만 아니라 OP 문제를 해결할 수있는 최선의 방법이기도합니다. downvote를 설명하는 배려? - Yakimych
  • 이유.ToList()작품은 당신이IEnumerable, 컬렉션은게으른방법. 이 경우, 매회각각루프는 항목을 가져오고, 쿼리는 사용중인 모든 항목을 데이터베이스에서 가져옵니다. 다시 반복하려면 쿼리를 다시 실행할 수 없습니다. 사용하면.ToList(),에있는 모든 항목IEnumerable처리되어 목록으로 저장됩니다. 그런 다음 원하는만큼 여러 번 생성 된 목록을 사용할 수 있습니다. - Vicro
  • 더 명확히하기. 문제의 근본 원인은 저장 프로 시저가 앞으로 만 결과 집합을 반환한다는 것입니다. 즉, 일단 끝에 도달하면 다시 시작하기 위해 쿼리를 다시 실행해야합니다. 그러나 A to list는 결과 집합을 원하는만큼 여러 번 열거 할 수있는 List 데이터 구조로 변환합니다. - Ageis

6

이것을 바꾸어보십시오.

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

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

모든 것이 잘 작동 할 것입니다.


  • 이것은 나를 위해 일했지만 왜 그럴지 모릅니다. - Nicholas Pickering
  • tolist ()는 엔티티를 무료로 만듭니다. 목록에 사용하지 않으면 엔티티가 공개되지 않고 작업 할 것이라고 예상합니다. - hosam hemaily

-5

이런 종류의 오류가 발생하면 proc 데이터를 일반적인 목록으로 저장 한 다음 다른 컨트롤을 바인딩하는 것이 좋습니다.이 오류가 발생하므로이 문제를 해결했습니다. 전의:-

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

이렇게 해봐.

연결된 질문


관련된 질문

최근 질문