LINQ to SQL MAX в предложении WHERE - PullRequest
5 голосов
/ 02 сентября 2011

Я новичок в Linq, поэтому, как и ожидалось, я столкнулся с трудностями. Я пытаюсь достичь этого:

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

Мой Линк:

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

Ответы [ 5 ]

7 голосов
/ 02 сентября 2011

Вам необходимо выбрать ID свойство

var dbUsers = from u in context.Users
              where u.Id == (context.Users.Select(u1 => u1.Id).Max())
              select u;
1 голос
/ 20 февраля 2015

Пожалуйста, дайте мне знать, если это решит вашу проблему:

var dbUser = (from u in context.Users
              orderby u.Id descending).FirstOrDefault()
1 голос
/ 03 сентября 2011

Рассмотрите возможность использования оператора let:

var dbUsers = from u in context.Users
              let int maxId = context.Users.Max(u1 => u1.Id)
              where u.Id == maxId
              select u;
1 голос
/ 02 сентября 2011

Я обычно делаю 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 голосов
/ 02 мая 2015

Вы можете использовать лямбда-выражения:

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

или:

var dbUser = context.Users.OrderByDescending(u => u.Id).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...