web-dev-qa-db-fra.com

Erreur "Le lecteur de données a plusieurs champs" dans Entity Framework

J'exécute cette requête simple avec Entity Framework

db.Database.SqlQuery<string>("SELECT * FROM hospital");

Mais j'ai eu cette erreur:

Le lecteur de données a plusieurs champs. Les champs multiples ne sont pas valides pour les types de primitive ou d’énumération EDM.

Quel pourrait être le problème?

26
user2195741

Il serait utile de voir à quoi ressemble la table d'hôpital, mais en supposant que quelque chose de simple ressemble à un hôpital comprenant HospitalId et HospitalName, vous avez le choix.

db.Database.SqlQuery<IEnumerable<string>>("SELECT hospitalName FROM hospital"); //would work if all you're trying to do is get the Name

db.Database.SqlQuery<MyEntity>("SELECT * FROM hospital"); //where you define MyEntity as the same structure as the table would work

db.Database.SqlQuery<IEnumerable<Tuple<int, string>>>("SELECT * FROM hospital"); // would theoretically work although I haven't tried it.  Where the Tuple items would have to match the database types in order.  I.e. if field 1 is an int and field 2 is a string then Tuple<int,string>

Fondamentalement, l'erreur est que le code ne sait pas comment insérer la chaîne dans la structure de l'hôpital

35
cgotberg

Cela a résolu mon problème, certains résultats ne fonctionnant pas comme prévu.

string storedProcedure = "Admin_AutoGenerateKeywordsFortblCompany @Company_ID=" + CompId;

var s= db.ExecuteStoreQuery<List<string>>("exec " + storedProcedure).ToList();

ici un ou plusieurs résultats peuvent être pris

6
user4584103

Vous pouvez également obtenir cette erreur si vous essayez d'exécuter une commande INSERT, UPATE ou DELETE

Au lieu d'utiliser SqlQuery, utilisez ExecuteSqlCommand

using (var ctx = new SchoolDBEntities())
{
    int noOfRowUpdated = ctx.Database.ExecuteSqlCommand("Update student 
            set studentname ='changed student by command' where studentid=1");

    int noOfRowInserted = ctx.Database.ExecuteSqlCommand("insert into student(studentname) 
            values('New Student')");

    int noOfRowDeleted = ctx.Database.ExecuteSqlCommand("delete from student 
            where studentid=1");
}

Pour plus de détails, visitez - http://www.entityframeworktutorial.net/EntityFramework4.3/raw-sql-query-in-entity-framework.aspx

Sur la base de la réponse de seconde que cgotberg m'a donnée, je vais répondre à ma propre question . Le problème avec ce code était que le champ de certaines tables n'était pas le même que celui de la base de données (je cherchais l'exception mais je ne pouvais pas le trouver, désolé pour cela), mais il existe en réalité . dû ajouter tous les champs des tables à la chaîne de requête. Je veux dire, je devais écrire "SELECT hospital_phone, holpital_street, etc, etc. FROM hospital", si j'écris "SELECT hospital_name FROM hospital", l'exception se produit.

J'espère que j'ai bien expliqué.

0
user2195741