2010-10-18 7 views
2

Je travaille sur EF avec C# et WPF comme frontal. J'ai besoin de fournir une interface utilisateur pour que l'utilisateur puisse créer sa propre requête et obtenir le résultat. L'interface utilisateur sera la liste des tables et la liste des colonnes à sélectionner (pas heureux avec l'interface utilisateur.Vous devez améliorer, mais de nouvelles mesures dans mon esprit). Donc, ma question est comment créer, fusionner (requête existante) et exécuter les requêtes.Comment faire pour exécuter des requêtes SQL sur EF?

Il existe un fournisseur Entity Client sql class, classe objectquery. J'ai utilisé ObjectQuery

string querystring = @"SELECT PrjDev FROM prjscenario"; 
ObjectQuery<PrjDev> prjdevquery = new ObjectQuery<PrjDev>(querystring, ptxobjcontext); 
string cpmmandtext = prjdevquery.CommandText; 
int prjdevnum = prjdevquery.Count(); 

Cela fonctionne. Mais quand je cours une requête complexe. Ça ne marche pas. Exemple de code:

string querystring = @"SELECT PrjDev FROM prjscenario WHERE PrjDev.PrjDevType = 10"; 

Erreur:

'PrjDevType' est pas un membre de « Transient.collection [Skm.Ptx.Data.Emf.PrjDev (Nullable = True, DefaultValue =)] '. Pour extraire une propriété d'un élément de collection , utilisez une sous-requête pour itérer sur la collection. Près de simples identifiant , ligne 1, colonne 45.

Toute idée, pourquoi il est bon pour une requête simple mais il ne fonctionne pas pour les requêtes complexes?

Merci à l'avance, N

Répondre

11

La requête passée en paramètre au constructeur ObjectQuery<T> est pas une requête SQL, il est une requête ESQL (Entity SQL). Bien que similaires dans la syntaxe, ils sont des langages très différents. Vous pouvez en apprendre plus sur ESQL on this page. Si vous souhaitez exécuter du SQL réel sur la base de données sous-jacente ObjectContext, vous pouvez utiliser la méthode ObjectContext.ExecuteStoreQuery ou simplement récupérer la connexion via la propriété ObjectContext.Connection et écrire le code ADO.NET "classique" à partir de là.

+0

Salut Thomas, je cherchais sur ExecuteStoreQuery et E SQL. Premier ExecuteStoreQuery me semble bon. Cela fonctionne parfaitement avec une requête simple. Mais quand je passe une requête complexe avec joindre sur trois tables. Il se brise par erreur comme Le lecteur de données est incompatible avec le 'Emf.PrjDevCable' spécifié. Un membre du type 'PrjDevID' n'a pas de colonne correspondante dans le lecteur de données portant le même nom. –

+0

Il ne fonctionnera pas pour les types anonymes, uniquement pour les types nommés (car vous ne pouvez pas spécifier le type anonyme comme paramètre de type générique). La requête doit renvoyer les mêmes noms de colonne que dans votre modèle –

+0

Merci. J'ai résolu le problème et suis venu ici pour répondre à votre message. J'ai fais la même chose. J'utilisais le nom de sélection, le type des jointures de table ... Maintenant j'utilise Select * From Table Join .... Sur une note courte, L2S Support les deux. Mais EMF fonctionne bien avec Select * .... Merci, N –

Questions connexes