Usando SQL con Entity Framework

Cuando se utiliza Entity Framework con Code First generalmente se utiliza Linq para que el DBContext relacione el linq con el objeto, por ejemplo si quiero un usuario especifico de mi aplicación escribo algo como

using (SecurityEngineDb LAPDb = new SecurityEngineDb())
{
var user = LAPDb.users.Single(p => p.username == userName);
return user;
}

Entonces EF transforma eso en la instrucción Select [Campos] from Users Where UserName = @UserName, etc, etc.
Ahora bien, hay algunas instrucciones SQL que por su complejidad, optimización o la razón que sea no se puede escribir utilizando linq, así que el context también incluye la capacidad de escribir instrucciones SQL, utilizando DBContext.Database.SqlQuery, y a este método le podemos pasar la instruccion SQL y sus parámetros (ya todos sabemos que las instrucciones SQL deben ser parametrizadas para evitar ataques de SQL Injection cierto? pero bueno ese es otro post). El método sqlQuery es un genérico asi que si el entity framework es tan inteligente que se da cuenta que al final el objeto es un usuario o cualquier otra entidad del modelo simplemente lo pongo en el SqlQuery(sqlInstucction, parameters) y voila, tengo unos usuarios que son el resultado de mi complicada instrucción SQL.

Pero y si la instrucción SQL retorna un conjunto de columnas que no corresponden a ninguna de mis clases del modelo? (algo que creo que es muy común, por ejemplo, en reportes), pues hemos visto que una alternativa es declarar esa clase independiente del modelo y utilizarlo como parámetro en el sqlQuery.

Por ejemplo, mi consulta compleja devuelve unos campos que son equivalentes a esta clase:

public class FullfiledTransition
{
public int Requested { get; set; }
public int Fullfilled { get; set; }
public Guid Transition_id { get; set; }
public Guid idSourceActivity { get; set; }
public Guid idTargetActivity { get; set; }
}

puedo definirla sin que quede relacionada con el modelo , es decir no quiero un objeto en la base de datos con esta estructura. y utilizarla con el sqlQuery asi:

var fullfilledTransitions = wfEngineDb.Database.SqlQuery(sb.ToString(), activityInstanceId);
donde sb es el StringBuilder (ya sabemos que siempre hay que concatenar con stringBuilde cierto?) de mi instrucción SQL y activityInstanceId el parámetro que recibe esa instrucción.

es un pequeño truco que ayuda a sacar máximo provecho del EF y su capacidad de ejecutar instrucciones SQL.