【问题标题】:Generating an ID for each result using Linq使用 Linq 为每个结果生成一个 ID
【发布时间】:2017-08-30 16:25:26
【问题描述】:

我正在创建一个 Web API 来显示我们系统中的忠诚度计划列表。每个忠诚度计划都有一个超长的 GUID,我想把它变成一个简单的唯一 ID。

API 的目的是用一个 ID 显示每个项目,然后最终用户可以使用相同的命令和该 ID 号来获取有关忠诚度计划的更多信息。

在 SQL 中,我会使用 Rank Over 之类的东西,但我不确定如何在此处应用它。

var ReturnedLoyalty = from d in db.LoyaltyCampaigns
                                  where d.CampaignStart < DateTime.Now && d.CampaignStop >= DateTime.Now
                                  orderby d.CampaignName ascending
                                  select new { d.CampaignGUID, d.CampaignName };

我想将 d.campaignguid 替换为一组简单的数字,例如 1、2、3... 等。

【问题讨论】:

  • 您可以使用.Select((value, index)=&gt;...})(linq to objects)来实现这一点……但如果你想要一个基于整数的 ID……添加一个基于整数的 ID。否则数字会随着时间的推移而变化,这会让人们感到困惑。
  • SQL 表是由第三方软件供应商创建的。他们的软件在幕后使用 GUID 列,并将其设置为表格上的 indentity 列。所以我无法在 SQL 表上创建新的身份。
  • 即使您必须使用触发器或其他事件维护 ID,我仍然猜想您添加一列,就好像删除、添加或重命名了任何内容一样,这些数字会发生变化。

标签: entity-framework linq asp.net-web-api2


【解决方案1】:

不幸的是查询理解语法不支持select的两个参数版本,但你可以在查询之后使用它:

var ReturnedLoyalty = (from d in db.LoyaltyCampaigns
                       where d.CampaignStart < DateTime.Now && d.CampaignStop >= DateTime.Now
                       orderby d.CampaignName ascending
                       select d.CampaignName).Select((name, index) => new { ID = index, CampaignName = name});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2021-01-16
    相关资源
    最近更新 更多