2011-09-02 2 views
5

Sono nuovo a Linq, così come previsto, ho riscontrato delle difficoltà. Quello che sto cercando di realizzare è questo:LINQ a SQL MAX nella clausola WHERE

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

mio Linq è:

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

Ma ho sempre finiscono con la seguente eccezione:

Impossibile creare un valore costante di digita "Bla.Users". Solo i tipi primitivi ('come Int32, String e Guid') sono supportati in questo contesto .

Qui è la classe degli utenti:

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

Qui è la mia classe del contesto:

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

risposta

7

È necessario selezionare la proprietà ID

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

stesso problema. Ho dimenticato di dire che sto usando MySQL come fonte di dati. –

+0

Se sposto l'aggregato Max all'esterno della query, le cose funzionano: int id = context.Users.Max (u1 => u1.Id) e quindi var dbUsers = da u in context.Users dove u.Id == id seleziona u; –

1

solito faccio il mio LINQing in 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 
    }); 

Se si desidera che il formato di comprensione ...

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

Grazie per la tua risposta, ma sto ottenendo la stessa eccezione. –

1

considerare l'utilizzo di un let dichiarazione:

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

Lo stesso errore purtroppo. Il problema si trova in questo contesto di subquery.Users.Max (u1 => u1.Id) ma non riesco a capire perché. –

1

Si prega di farmi sapere se questo risolve il problema:

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

È possibile utilizzare 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();