2011-09-02 101 views
5

我是Linq的新手,所以我期望遇到困难。 我想实现的是:LINQ to SQL MAX在WHERE子句中

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

我的LINQ是:

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

但我始终有以下例外结束:

无法创建的恒定值键入'Bla.Users'。在此 上下文中仅支持原始类型 类型(如Int32,String和Guid)。

下面是用户等级:

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

这里是我的上下文类:

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

回答

7

您需要选择ID财产

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

同样的问题。我忘了提及我使用MySQL作为数据源。 –

+0

如果我将最大集合移动到查询之外,事情就会起作用:int id = context.Users.Max(u1 => u1.Id)然后var dbUsers = from u in context.Users where u.Id == id 选择你; –

1

我通常做我的lambda格式的LINQing ...

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 
    }); 

如果你想理解的格式...

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

感谢您的回复,但我得到同样的例外。 –

1

考虑使用let声明:

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

不幸的是同样的错误。该问题驻留在这个子查询context.Users.Max(u1 => u1.Id),但我不明白为什么。 –

1

请让我知道,如果这一个解决您的问题:

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

您可以使用lambda expressio NS:

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

或:

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