Entity Framework: виконання чистих sql запитів

  1. Написання SQL запитів для сутностей
  2. Завантаження сутностей зі збережених процедур
  3. Написання SQL запитів для несущностних класів
  4. Відправка простих команд базі даних

Entity Framework дозволяє виконувати запити використовуючи LINQ з вашими класами сутностей (entity classes). Однак можуть бути випадки коли ви хочете виконати чисті SQL запити безпосередньо до бази даних. Даний сценарій включає виклик збережених процедур, що може бути корисно для Code First моделей, які поки не підтримують маппинг на збережені процедури. Прийоми описані в цьому пості підходять для моделей створених з Code First і EF дизайнером.

Написання SQL запитів для сутностей

Метод SqlQuery класу DbSet дозволяє написати SQL запит, який поверне екземпляри сутностей. Повертаються об'єкти будуть сприйматися контекстом так само як як якби вони були повернуті LINQ запитом. наприклад:

using (var context = new BloggingContext ()) {var blogs = context.Blogs.SqlQuery ( "SELECT * FROM dbo.Blogs"). ToList (); }

Варто відзначити, що так само як для LINQ запитів, запроос НЕ Виконуємо до тих пір поки результатів не перераховуються - впрімере вище це робиться при виклику методу ToList.

Треба бути особливо уважним при написанні чистих SQL запитів з двох причин. По-перше, запит повинен бути нанісан таким чином, що він повертає тільки ті сутності, які дійсно відповідають запрошенням типу. Наприклад, при використанні прийомів таких як успадкування, дуже легко написати запит який створить суті неправильного CLR типу.

По-друге, деякі типи чистих SQL запитів вносять потенційну загрозу безпеці, особливо SQL ін'єкцій. Переконайтеся що ви правильним чином використовуєте параметри в ваших запитах що б захиститися від таких атак.

Завантаження сутностей зі збережених процедур

Ви можете використовувати DbSet.SqlQuery що б завантажити суті з результатів збереженої процедури. Наприклад, следуюущій код викликає процедуру dbo.GetBlogs в базі даних:

using (var context = new BloggingContext ()) {var blogs = context.Blogs.SqlQuery ( "dbo.GetBlogs"). ToList (); }

Ви також можете передати параметри збереженій процедурі використовуючи наступний синтаксис:

using (var context = new BloggingContext ()) {var blogId = 1; var blogs = context.Blogs.SqlQuery ( "dbo.GetBlogById @ p0", blogId) .Single (); }

Написання SQL запитів для несущностних класів

SQL запит повертає екземпляри будь-якого типу, включаючи примітивні типи, може бути створений використовуючи метод SqlQuery класу Database. наприклад:

using (var context = new BloggingContext ()) {var blogNames = context.Database.SqlQuery <string> ( "SELECT Name FROM dbo.Blogs"). ToList (); }

Результати повернуті методом SqlQuery класу Database ніколи не будуть відслідковані контекстом, навіть якщо екземпляри є типу сутності.

Відправка простих команд базі даних

Прості команди можуть бути відправлені базі даних використовуючи метод ExecuteSqlCommand класу Database. наприклад:

using (var context = new BloggingContext ()) {context.Database.SqlCommand ( "UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1"); }

Зверніть увагу на те, що будь-які зміни зроблені в базі даних іспозуя метод ExecuteSqlCommand є непрозорими для контексту до тих пір поки суті не будуть завантажені або перезавантажувались з бази даних.

джерело тут .