2011-09-02 32 views
5

Soy nuevo en Linq así que como esperaba, he encontrado dificultades. Lo que estoy tratando de lograr es la siguiente:LINQ to SQL MAX en WHERE cláusula

SELECT id, name, password 
FROM users u 
WHERE u.id = (SELECT MAX(u1.id) FROM users u1); 

Mi LINQ es:

var dbUsers = from u in context.Users 
       where u.Id == (context.Users.Max(u1 => u1.Id)) 
       select u; 

Pero siempre termina con la siguiente excepción:

No se puede crear un valor constante de tipo 'Bla.Users'. Solo los tipos primitivos ('como Int32, String y Guid') son compatibles en este contexto .

Aquí es la clase de usuarios:

public class Users 
    { 
     [Key] 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Password { get; set; } 
    } 
} 

Aquí es mi clase de contexto:

public class EFDbContext : DbContext 
    { 
     public DbSet<User> Users{ get; set; } 
    } 

Respuesta

7

Es necesario seleccionar la propiedad ID

var dbUsers = from u in context.Users 
       where u.Id == (context.Users.Select(u1 => u1.Id).Max()) 
       select u; 
+0

mismo problema. Olvidé mencionar que estoy usando MySQL como fuente de datos. –

+0

Si muevo el agregado máximo fuera de la consulta, las cosas funcionan: int id = context.Users.Max (u1 => u1.Id) y luego var dbUsers = desde u en context.Users donde u.Id == id seleccione u; –

1

por lo general hago mi LINQing en formato lambda ...

var dbUsers = DataContext.Users 
    .Where(u => u.Id == (DataContext.Users.Max(u1 => u1.Id))) 
    .Select(u => new 
    { 
     Id = u.Id, 
     Name = u.Name, 
     Password = u.Password 
    }); 

Si desea que el formato de la comprensión ...

var dbUsers = from u in DataContext.Users 
    where u.Id == (DataContext.Users.Max(u1 => u1.Id)) 
    select new 
    { 
     Id = u.Id, 
     Name = u.Name, 
     Password = u.Password 
    }; 
+0

Gracias por su respuesta, pero estoy recibiendo la misma excepción. –

1

considerar el uso de una declaración let:

var dbUsers = from u in context.Users 
       let int maxId = context.Users.Max(u1 => u1.Id) 
       where u.Id == maxId 
       select u; 
+0

Desafortunadamente el mismo error. El problema reside en este contexto de subconsulta.Users.Max (u1 => u1.Id) pero no puedo entender por qué. –

1

Por favor, hágamelo saber si éste resuelve su problema:

var dbUser = (from u in context.Users 
       orderby u.Id descending).FirstOrDefault() 
0

Podría usar lambda expressio ns:

var dbUser = context.Users.First(u => u.Id== (context.Users.Select(u2 
=> u2.Id).Max())); 

o:

var dbUser = context.Users.OrderByDescending(u => u.Id).FirstOrDefault();