【问题标题】:Update a List of entries using a List of ID's in EntityFramework使用 EntityFramework 中的 ID 列表更新条目列表
【发布时间】:2014-01-17 17:46:03
【问题描述】:

我正在使用以下代码将 connectionID 列表存储在 List<string> 中:

List<string> connectionIds =
                    connectedUsers.Where(x => x.UserId == userId).Select(x => x.ConnectionId).ToList();

当找到相应的 ID 时,我需要更新数据库以将连接状态设置为 false。到目前为止,我正在使用以下代码:

if (connectionIds.Any())
                {
                    foreach (string connectionId in connectionIds)
                    {
                        Connection curConn = db.Connection.FirstOrDefault(x => x.ConnectionID == connectionId);
                        if (curConn != null)
                            curConn.Connected = false;
                        db.SaveChanges();
                    }
                }

但是,这会为每个连接调用数据库...有什么简单的方法可以更轻松地更新连接吗?

【问题讨论】:

  • 它实际上进行了两次调用——一次加载对象,一次保存更改。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

您可以使用Contains 方法。这将导致用于加载连接对象的单个查询。获得查询结果后,循环遍历结果以更新 Connected 标志,然后保存更改。

List<string> connectionIds = ...;

if (connectionIds.Any()) {
    var data = db.Connection
        .Where(x => connectionIds.Contains(x.ConnectionID))
        .ToList();
    foreach (var item in data) {
        item.Connected = false;
    }
    db.SaveChanges();
}

【讨论】:

  • 完美!谢谢你:)
  • 请注意,该列表是使用参数“给定”给 SQL 的,并且查询的最大参数数量(我认为大约在 2000 年左右),所以如果您期望更多的连接 ID,那么这个解决方案将不起作用。
  • 哇哦 - 谢谢你的信息!根本不知道这些限制。如果我得到那个数量(虽然不应该),我会检查一下。
【解决方案2】:

您希望使用 EF 在一条 SQL 语句中执行批量更新。 EF 不以直接的方式支持这一点。请参阅here 了解可能的解决方案。

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2015-07-19
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多