【问题标题】:How do I get the max ID with Linq to Entity?如何使用 Linq to Entity 获取最大 ID?
【发布时间】:2010-09-23 21:02:12
【问题描述】:

我有一个表用户,它有一个标识列UserID,现在正确的 Linq to Entity 代码行将返回最大UserID

我试过了:

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

    return user.UserID;
}

LastMax 似乎不受支持。

有什么想法吗?

【问题讨论】:

    标签: c# linq entity-framework linq-to-entities


    【解决方案1】:

    请注意,如果键是 varchar,则这些答案都不起作用,因为在填充有“ints”的 varchar 列中使用 MAX 很诱人。

    在数据库中,如果有一列,例如“Id”在数据库 1,2,3,110,112,113,4,5,6 那么上面所有的答案都会返回 6。

    因此,在您的本地数据库中,一切都会正常工作,因为在开发过程中,您永远不会获得超过 100 条测试记录,然后,在生产过程中的某个时刻,您会收到一张奇怪的支持票。然后一个小时后,您发现正是这条线“max”,它似乎由于某种原因返回了错误的键....

    (请注意,上面没有任何地方说密钥是 INT...)(如果碰巧最终出现在通用库中...)

    所以使用:

    Users.OrderByDescending(x=>x.Id.Length).ThenByDescending(a => a.Id).FirstOrDefault();

    【讨论】:

      【解决方案2】:

      这样做

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

      【讨论】:

      • 有人知道这个解决方案与 Max(u => u.userId) 解决方案相比的性能吗?
      • 我不确定,但恕我直言,Max 比 Order 性能更高,因为 Max 是 O(n),而 Sort 意味着一些排序算法,它比 O(n) 大得多。
      【解决方案3】:

      如果您使用asyncawait 功能,则如下所示:

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

      【讨论】:

        【解决方案4】:

        获取你添加的实体的id最好的方法是这样的:

        public int InsertEntity(Entity factor)
        {
            Db.Entities.Add(factor);
            Db.SaveChanges();
            var id = factor.id;
            return id;
        }
        

        【讨论】:

          【解决方案5】:

          尼萨普列托

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

          将不起作用,因为 MAX 返回的变量类型与该字段相同,因此在这种情况下是一个 INT 而不是一个用户对象。

          【讨论】:

            【解决方案6】:
            var max = db.Users.DefaultIfEmpty().Max(r => r == null ? 0 : r.ModelID);
            

            当 db 中没有记录时,它会毫无例外地返回 0。

            【讨论】:

            • r => r?.ModelId ?? 0 - 新 C# 中的快捷方式
            【解决方案7】:

            试试这个

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

            更新:

            如果没有记录则使用上面的代码生成异常试试这个

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

            【讨论】:

            • 谢谢它对我有帮助吗? intIdt = db.Users.Max(u => (int?)u.UserId);
            • 只是我还是这种风格比 Jonas Kongslund 的答案更具可读性?
            • @BornToCode 这取决于你实际想要做什么。该解决方案回答了问题(它获得了最大 id),而 Jonas Kongslund 的回答返回了具有最大 id 的对象。
            • 最有说服力的答案!
            • Jonas 的 OrderByDecending 方法比使用 Max - 14ms / 11ms 稍快
            猜你喜欢
            • 2011-09-19
            • 2010-09-27
            • 2018-07-12
            • 2012-07-07
            • 1970-01-01
            • 2016-05-25
            • 1970-01-01
            • 2019-03-11
            • 2013-10-26
            相关资源
            最近更新 更多