2012-02-28 16 views
5

Tengo un problema LINQ simple que no puedo entender. Tengo una tabla Users y una tabla Employees. Un usuario puede tener 0 ... n empleados.Uso de la palabra clave "let" en una consulta LINQ con EF 4.3

me gustaría hacer algo como esto:

var result = from u in context.users 
      where u.UsrId = 2 
      let e = u.Employees.First() 
      select new 
{ 
    UserId = u.UsrId, 
    FirstName = e.FirstName 
}; 

eso no funciona, por supuesto, robaba la llamada First() es ilegal. First() solo puede aparecer al final de select. Lo que también no funcionó es seleccionar el empleado en una consulta anterior, así:

var employee = from e. in context.Employees..... 

... y luego dicen let e = employee en lugar de let e = u.Employees().First()

No estoy seguro de si el uso de dejar correcta. Pensé que era para subconsultas.

El motivo de la llamada First() es que la tabla Empleados no debe tener más de una entrada para cada usuario. Eso es un error en el diseño y tengo que lidiar con eso ahora. Entonces solo quiero el primero.

Respuesta

4
var result = from u in context.users 
let e = u.Employees.FirstOrDefault(x => x.bossId == u.UsrId) 
where u.UsrId = 2 
select new { UserId = u.UsrId, FirstName = e.FirstName }; 

Sólo un tipp sin prueba.

+0

Hola; ¿Podrías ayudarme a entender qué pasa con la consulta de LINQ superior en la pregunta? Tu consulta y eso me parecieron idénticas. – UfukSURMEN

1

Primero se puede utilizar, excepto en el medio de una declaración queitativa LINQ, al traducir esa declaración a SQL, en realidad no hay manera de constituir un Primero, ya que su comportamiento es arrojar un error. FirstOrDefault, sin embargo, se puede traducir a Top (1), que es cómo se transforma a SQL. Esto significa que usar primero en el medio de una declaración traducible de SQL no es realmente válido, sin embargo, creo que lo han permitido, ya que la última declaración como resultado cero puede traducirse a una ejecución posterior de excepción de consulta.

Cuestiones relacionadas