Entity Framework: SQL nativo

En Entity Framework puede consultar sus clases de entidad usando LINQ. También puede ejecutar consultas usando SQL sin procesar directamente contra la base de datos usando DbCOntext. Las técnicas se pueden aplicar igualmente a modelos creados con Code First y EF Designer.

Consulta SQL sobre entidad existente

El método SqlQuery en DbSet permite escribir una consulta SQL sin formato que devolverá instancias de entidad. Los objetos devueltos serán rastreados por el contexto tal como lo serían si fueran devueltos por una consulta LINQ. Por ejemplo

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         var students = context.Students.SqlQuery("SELECT * FROM dbo.Student").ToList();

         foreach (var student in students) {
            string name = student.FirstMidName + " " + student.LastName;
            Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ",
               student.ID, name, student.EnrollmentDate.ToString());
         }

         Console.ReadKey();
      }
   }
}

El código anterior recuperará a todos los estudiantes de la base de datos.

Consulta SQL para tipos que no son entidades

Se puede crear una consulta SQL que devuelva instancias de cualquier tipo, incluidos los tipos primitivos, utilizando el método SqlQuery en la clase Database. Por ejemplo

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         var studentNames = context.Database.SqlQuery
            <string>("SELECT FirstMidName FROM dbo.Student").ToList();

         foreach (var student in studentNames) {
            Console.WriteLine("Name: {0}", student);
         }

         Console.ReadKey();
      }
   }
}

Comandos SQL a la base de datos

El método ExecuteSqlCommnad se utiliza para enviar comandos que no son de consulta a la base de datos, como el comando Insertar, Actualizar o Eliminar. Echemos un vistazo al siguiente código en el que el nombre del estudiante se actualiza como ID = 1

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         //Update command

         int noOfRowUpdated = context.Database.ExecuteSqlCommand("Update 
            student set FirstMidName = 'Ali' where ID = 1");

         context.SaveChanges();

         var student = context.Students.SqlQuery("SELECT * FROM
            dbo.Student where ID = 1").Single();

         string name = student.FirstMidName + " " + student.LastName;

         Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ", 
            student.ID, name, student.EnrollmentDate.ToString());

         Console.ReadKey();
      }
   }
}

El código anterior recuperará el nombre de todos los estudiantes de la base de datos.