【问题标题】:Incrementing an ID using LINQ使用 LINQ 递增 ID
【发布时间】:2017-07-11 16:15:26
【问题描述】:

每当我从前端添加一个新对象时,id = 0。在 WebApi 层中,我试图找到对象列表中存在的最大 ID,然后将下一个 ID 分配给新对象。下面的代码没有正确增加 ID

List<Event> events = eventVal.Where(e => e != null).ToList();
int eventMaxID = events.Max(e => e.id);

events.Where(e => e.id == 0)
  .Select((e, ixc) => new { id = eventMaxID + 1, Iter = eventMaxID + 1 })
  .ToList();

我不确定如何使用 Select 方法的第二个参数。

任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 您的示例代码是否正确?您对events.Select(e =&gt; e.id == 0) 的调用看起来像是您的意思是events.Where(e =&gt; e.id == 0)
  • 是的,你是对的。

标签: c# linq asp.net-web-api lambda


【解决方案1】:

在您使用的第二种形式的 Select 中,ixc 是集合中项目的索引。您需要添加它以及之前的最大 ID。这样你也不用担心分配给 Iter(看起来你只是将它用作某种计数器)所以我已经删除了它。

var autoIncrementedEvents = events.Where(e => e.id == 0)
  .Select((e, ixc) => 
  {
     e.id = eventMaxId + 1 + ixc;
     return e;
  })
  .ToList();

请注意,您的代码编写方式会丢弃此 Linq 语句的结果。您需要将其分配给我在上面所做的事情。

我不打算评论这作为网络设置中的整体方法的有效性(竞争条件、重复 ID 等)。理想情况下,您的数据存储区应该分配 ID。

【讨论】:

  • 你能详细说明“没用”吗?很难准确地说出你想要完成什么。
  • 那行不通。我正在尝试将事件中的 ID 列更新为下一个递增的 ID。 List&lt;Event&gt; newEvent = events.Where(e =&gt; e.id == 0) .Select((e, ixc) =&gt; new { id = ixc + eventMaxID + 1 + e.id}) .ToList(); 给出错误“无法将类型 'System.Collections.Generic.List 隐式转换为 'System.Collections.Generic.List
  • @rds80 Linq 用于选择和转换。您现在已将 Event 转换为匿名类型。
  • @rds80 那是因为您使用了 new {},它创建了一个匿名对象。我只是从您的原始问题中复制。如果您需要处理事件,请参阅我的更新代码 sn-p
  • 如果可能的话,绝对应该由数据库来完成。考虑一下场景是两个调用同时在不同的线程上进入您的 API。您将无法正确协调 Id 的分配
猜你喜欢
  • 1970-01-01
  • 2010-09-28
  • 2019-02-13
  • 2015-12-31
  • 2017-08-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多