web-dev-qa-db-fra.com

Le résultat d'une requête ne peut être énuméré plus d'une fois

J'utilise l'entité framework (ef) et j'obtiens l'erreur suivante:

"Le résultat d'une requête ne peut être énuméré plus d'une fois.".

J'ai une classe de référentiel qui contient le contexte de données ef. J'ai ensuite une classe de contrôleurs (à ne pas confondre avec les contrôleurs MVC) qui contient une instance du référentiel. Jusqu'ici tout va bien ... J'ai une méthode de recherche sur le contrôleur qui est supposée renvoyer un tableau de RadComboBoxItemData, utilisé pour remplir un contrôle 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();
}

Lorsque je débogue mon code, je peux entrer dans la boucle foreach, mais j'obtiens une erreur disant:

Une exception de type 'System.InvalidOperationException' s'est produite dans System.Data.Entity.dll mais n'a pas été gérée dans le code utilisateur

Informations complémentaires: Le résultat d'une requête ne peut être énuméré plus d'une fois.

Mon entité utilise une importation de fonction d'un proc stocké existant.

// 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);
}

La fonction import Search appelle un précédent stocké pour renvoyer une collection de SearchItem.

J'ai le sentiment que la boucle foreach ne peut pas itérer à cause de quelque chose avec le ef.

66
Halcyon

Essayez d’énumérer explicitement les résultats en appelant ToList().

Changement

foreach (var item in query)

à

foreach (var item in query.ToList())
137
Yakimych

Essayez de remplacer ceci

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

avec

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

et tout fonctionnera bien.

7
hosam hemaily