【问题标题】:creating a list of Id's from database. C#从数据库中创建一个 ID 列表。 C#
【发布时间】:2021-04-23 07:42:47
【问题描述】:

我试图生成一个随机 ID 号,因此当用户单击一个按钮时,它会重定向到一个随机艺术家。我能够做到,并且与下面的代码配合得很好。

var artists = _context.Artists;
var totalArtists = artists.Count();
Random randomArtistNumber = new Random();
int randomArtistID = randomArtistNumber.Next(1, totalArtists + 1);

if (button.Equals("btnArtist"))
{
    return RedirectToAction("Details", "ArtistModels", new { id = randomArtistID.ToString() });
}

这里的问题是,如果用户删除了一个艺术家,那么我将拥有一个不再存在于上面创建的随机列表中的 ID 号。我将如何在艺术家表中创建一个 List 的所有 ArtistID?最好从活动 ID 列表中选择一个随机数

以下ArtistModel

public class ArtistModel
    {
        [Key]
        public int ArtistID { get; set; }
        public string ArtistName { get; set; }
        public string CountryOfOrigin { get; set; }
        public int SubgenreID { get; set; }
        public SubgenreModel Subgenre { get; set; }

        public ICollection<AlbumModel> Albums { get; set; }
    }

【问题讨论】:

标签: c# list asp.net-core model-view-controller


【解决方案1】:

我猜你正在使用实体框架?

您应该能够通过执行以下操作从您的艺术家那里获取 id 列表。

var artistIds = artists.Select(a => a.Id).ToList();

要正确执行此操作,您需要确保始终从上下文加载所有艺术家。

如果你的随机函数有一个限制可能会更好,比如从前 200 位艺术家中随机选择什么的。

【讨论】:

  • 这很好用,谢谢,我不知道 Select 功能,这正是我想要的。
  • 这种方法的问题是,如果艺术家的数量很大,那么你的列表就会很大。另一种看待它的方法是不缓存 ID。相反,请随机挑选一位艺术家。如果艺术家查找失败,请回到井中并拉出另一个。这样做直到你成功。
  • 一个巨大的列表会成为内存问题吗?
  • @elementmg 是的,大列表可能会成为内存问题。由于多种原因,它不是很实用。随着艺术家名单的增加,它变得更加不可持续。您可以轻松地应用一些逻辑,首先获取您拥有的记录总数,然后从您的总范围内的某个位置获取 100 个记录 ID,然后对其应用随机化...
【解决方案2】:

既然你已经有了艺人,你实际上可以做的是随机找一个艺人,和你有的没有太大区别

类似:

int randomArtistIndex = randomArtistNumber.Next(1, totalArtists); 
var artist = artists[randomArtistIndex]

然后

return RedirectToAction("Details", "ArtistModels", new { id = artist.ArtistID.ToString() });

【讨论】:

  • 无法将 [] 索引应用于 DbSet 类型的表达式
  • 我的错,下次使用 .ToList() 应该可以解决问题
猜你喜欢
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多