Як отримати максимальний ідентифікатор за допомогою Linq для організації?


83

У мене є таблиця Користувач, яка має стовпець ідентичності UserID, тепер який правильний рядок коду Linq to Entity може повернути мені максимальну кількість UserID?

Я пробував:

using (MyDBEntities db = new MyDBEntities())
{
    var User = db.Users.Last();
    // or
    var User = db.Users.Max();

    return user.UserID;
}

але Lastі Max, схоже, не підтримується.

Будь-які ідеї?

Відповіді:


153

Робіть це так

db.Users.OrderByDescending(u => u.UserId).FirstOrDefault();

4
Хтось знає ефективність цього рішення порівняно з рішенням Max (u => u.userId)?
— Фелікс Кейл,

Я не впевнений у цьому, але IMHO Max є більш продуктивним, ніж Order, оскільки Max дорівнює O (n), а Sort передбачає деякий алгоритм сортування, який набагато більший за O (n).
— Луїс,

104

спробуйте це

int intIdt = db.Users.Max(u => u.UserId);

Оновлення:

Якщо записів немає, то згенеруйте виняток, використовуючи наведений вище код, спробуйте це

int? intIdt = db.Users.Max(u => (int?)u.UserId);

Дякую, це корисно для мене int? intIdt = db.Users.Max (u => (int?) u.UserId);
— GS Shekhawat

3
Це лише я, або цей стиль читабельніший за відповідь Йонаса Конгслунда?
— BornToCode

2
@BornToCode Це залежить від того, що ви насправді намагаєтесь зробити. Це рішення відповідає на питання (отримує максимальний ідентифікатор), тоді як відповідь Йонаса Конгслунда повертає об’єкт із максимальним ідентифікатором.
— актарам


11

NisaPrieto

Users user = bd.Users.Where(u=> u.UserAge > 21).Max(u => u.UserID); 

не буде працювати, тому що MAX повертає той самий тип змінної, що і поле, тому в цьому випадку це INT, а не користувацький об'єкт.


3

Якщо ви використовуєте функцію asyncта await, це буде наступним чином:

User currentUser = await db.Users.OrderByDescending(u => u.UserId).FirstOrDefaultAsync();

0

Найкращий спосіб отримати ідентифікатор сутності, яку ви додали, такий:

public int InsertEntity(Entity factor)
{
    Db.Entities.Add(factor);
    Db.SaveChanges();
    var id = factor.id;
    return id;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.