Est-il possible d’exécuter un SQL natif avec un framework d’entité?

J’essaie de rechercher un champ XML dans une table, cela n’est pas pris en charge avec EF.

Sans utiliser purement Ado.net est possible d’avoir un support SQL natif avec EF?

Pour .NET Framework version 4 et ObjectContext.ExecuteStoreCommand() : utilisez ObjectContext.ExecuteStoreCommand() si votre requête ne renvoie aucun résultat et utilisez ObjectContext.ExecuteStoreQuery si votre requête renvoie des résultats.

Pour les versions précédentes de .NET Framework, voici un exemple illustrant la procédure à suivre. Remplacez ExecuteNonQuery () si nécessaire si votre requête renvoie des résultats.

 static void ExecuteSql(ObjectContext c, ssortingng sql) { var entityConnection = (System.Data.EntityClient.EntityConnection)c.Connection; DbConnection conn = entityConnection.StoreConnection; ConnectionState initialState = conn.State; try { if (initialState != ConnectionState.Open) conn.Open(); // open connection if not already open using (DbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.ExecuteNonQuery(); } } finally { if (initialState != ConnectionState.Open) conn.Close(); // only close connection if not initially open } } 

À l’aide d’ Entity Framework 5.0 vous pouvez utiliser ExecuteSqlCommand pour exécuter SQL instructions SQL pures multi-lignes / multi-commandes. De cette façon, vous n’aurez pas à fournir d’object de sauvegarde pour stocker la valeur renvoyée, car la méthode retourne un int (le résultat renvoyé par la firebase database après l’exécution de la commande).

Échantillon:

 context.Database.ExecuteSqlCommand(@ "-- Script Date: 10/1/2012 3:34 PM - Generated by ExportSqlCe version 3.5.2.18 SET IDENTITY_INSERT [Students] ON; INSERT INTO [Students] ([StudentId],[FirstName],[LastName],[BirthDate],[Address],[Neighborhood],[City],[State],[Phone],[MobilePhone],[Email],[Enrollment],[Gender],[Status]) VALUES (12,N'First Name',N'SecondName',{ts '1988-03-02 00:00:00.000'},N'RUA 19 A, 60',N'MORADA DO VALE',N'BARRA DO PIRAÍ',N'Rio de Janeiro',N'3346-7125',NULL,NULL,{ts '2011-06-04 21:25:26.000'},2,1); INSERT INTO [Students] ([StudentId],[FirstName],[LastName],[BirthDate],[Address],[Neighborhood],[City],[State],[Phone],[MobilePhone],[Email],[Enrollment],[Gender],[Status]) VALUES (13,N'FirstName',N'LastName',{ts '1976-04-12 00:00:00.000'},N'RUA 201, 2231',N'RECANTO FELIZ',N'BARRA DO PIRAÍ',N'Rio de Janeiro',N'3341-6892',NULL,NULL,{ts '2011-06-04 21:38:38.000'},2,1); "); 

Pour plus d’informations, consultez ici: Entity Framework Code First: Exécution de fichiers SQL lors de la création d’une firebase database

Pour Entity Framework 5, utilisez context.Database.SqlQuery .

Et pour Entity Framework 4, utilisez context.ExecuteStoreQuery le code suivant:

  public ssortingng BuyerSequenceNumberMax(int buyerId) { ssortingng sequenceMaxQuery = "SELECT TOP(1) btitosal.BuyerSequenceNumber FROM BuyerTakenItemToSale btitosal " + "WHERE btitosal.BuyerID = " + buyerId + "ORDER BY CONVERT(INT,SUBSTRING(btitosal.BuyerSequenceNumber,7, LEN(btitosal.BuyerSequenceNumber))) DESC"; var sequenceQueryResult = context.Database.SqlQuery(sequenceMaxQuery).FirstOrDefault(); ssortingng buyerSequenceNumber = ssortingng.Empty; if (sequenceQueryResult != null) { buyerSequenceNumber = sequenceQueryResult.ToSsortingng(); } return buyerSequenceNumber; } 

Pour renvoyer une liste, utilisez le code suivant:

  public List PanelSerialByLocationAndStock(ssortingng locationCode, byte storeLocation, ssortingng itemCategory, ssortingng itemCapacity, byte agreementType, ssortingng packageCode) { ssortingng panelSerialByLocationAndStockQuery = "SELECT isws.ItemSerialNo, im.ItemModel " + "FROM Inv_ItemMaster im " + "INNER JOIN " + "Inv_ItemStockWithSerialNoByLocation isws " + " ON im.ItemCode = isws.ItemCode " + " WHERE isws.LocationCode = '" + locationCode + "' AND " + " isws.StoreLocation = " + storeLocation + " AND " + " isws.IsAvailableInStore = 1 AND " + " im.ItemCapacity = '" + itemCapacity + "' AND " + " isws.ItemSerialNo NOT IN ( " + " Select sp.PanelSerialNo From Special_SpecialPackagePriceForResale sp " + " Where sp.PackageCode = '" + packageCode + "' )"; return context.Database.SqlQuery(panelSerialByLocationAndStockQuery).ToList(); } 

Depuis .NET 4, vous pouvez utiliser la méthode ExecuteStoreQuery :

 var list = myDBEntities.ExecuteStoreQuery(MyClass.sql); 

où myDBEntities est hérité d’ObjectContext.

 class MyClass { /* You can change query to more complicated, eg with joins */ public const ssortingng sql = @"select [MyTable].[MyField] from [MyTable]"; public ssortingng MyField { get; set; } } 

Notez que MyTable est un nom de table réel, pas une classe EF.

Rester simple

 using (var context = new MyDBEntities()) { var m = context.ExecuteStoreQuery("Select * from Person", ssortingng.Empty); //Do anything you wonna do with MessageBox.Show(m.Count().ToSsortingng()); } 
 public class RaptorRepository where T : class { public RaptorRepository() : this(new RaptorCoreEntities()) { } public RaptorRepository(ObjectContext repositoryContext) { _repositoryContext = repositoryContext ?? new RaptorCoreEntities(); _objectSet = repositoryContext.CreateObjectSet(); } private ObjectContext _repositoryContext; private ObjectSet _objectSet; public ObjectSet ObjectSet { get { return _objectSet; } } public void DeleteAll() { _repositoryContext .ExecuteStoreCommand("DELETE " + _objectSet.EntitySet.ElementType.Name); } } 

Alors, que dit-on de tout cela en 2017? 80k consultations suggèrent que l’exécution d’une requête SQL dans EF est quelque chose que beaucoup de gens veulent faire. Mais pourquoi? Pour quel bénéfice?

Justin, un gourou avec 20 fois ma réputation, dans la réponse acceptée nous donne une méthode statique qui ressemble à une ligne pour une ligne comme le code ADO équivalent. Assurez-vous de bien le copier car il y a quelques subtilités pour ne pas vous tromper. Et vous êtes obligé de concaténer votre requête avec vos parameters d’exécution car il n’y a pas de disposition pour les parameters appropriés. Tous les utilisateurs de cette méthode construiront donc leur SQL avec des méthodes de chaîne (fragile, non testable, injection SQL), et aucun d’entre eux ne sera un test unitaire.

Les autres réponses ont les mêmes défauts, mais plus encore. SQL enterré entre guillemets. Opportunités d’injection SQL dispersées généreusement. Honoré pairs, c’est un comportement absolument sauvage. Si C # était généré, il y aurait une guerre des flammes. Nous n’acceptons même pas la génération de code HTML de cette façon, mais en quelque sorte, c’est OK pour SQL. Je sais que les parameters de requête n’étaient pas le sujet de la question, mais nous copions et réutilisons ce que nous voyons, et les réponses sont à la fois des modèles et des témoignages de ce que font les gens.

EF a-t-il fait fondre notre cerveau? EF ne veut pas que vous utilisiez SQL, alors pourquoi utiliser EF pour faire du SQL.

Vouloir utiliser le SQL pour parler à une firebase database relationnelle est une impulsion saine et normale chez les adultes. QueryFirst montre comment cela peut être fait intelligemment, votre fichier SQL dans le fichier .sql, validé lors de la frappe, avec intellisense pour les tables et les colonnes. Le wrapper C # est généré par l’outil, de sorte que vos requêtes deviennent détectables dans le code, avec intellisense pour vos entrées et résultats. Terminez pour terminer le typage fort, sans jamais avoir à vous soucier d’un type. Pas besoin de se souvenir d’un nom de colonne ou de son index. Et il y a de nombreux autres avantages … La tentation de concaténer est supprimée . La possibilité de mal gérer vos connexions également. Toutes vos requêtes et le code qui les accède sont testés en permanence par rapport à votre firebase database de développement. Les modifications de schéma dans votre firebase database apparaissent en tant qu’erreurs de compilation dans votre application. Nous générons même une méthode d’autotest dans l’encapsuleur, ce qui vous permet de tester les nouvelles versions de votre application par rapport aux bases de données de production existantes, plutôt que d’attendre que le téléphone sonne. Quelqu’un a encore besoin de convaincre?

Disclaimer: J’ai écrit QueryFirst 🙂