【问题标题】:Get lists of ID's and add on database using LINQ使用 LINQ 获取 ID 列表并添加到数据库
【发布时间】:2015-07-26 06:29:42
【问题描述】:

我有这个方法:

public ActionResult Complete(int id)
{
    // Validate customer owns this order
    bool isValid = storeDB.Orders.Any(
        o => o.OrderId == id &&
        o.Username == User.Identity.Name);

   bool CheckOrderValue = storeDB.Orders.Any(o => o.OrderId == id && o.Total == 0);
   int musicaID = storeDB.OrderDetails.Where(o => o.OrderId == id).Select(o => o.MusicaId).FirstOrDefault();

    if (isValid && CheckOrderValue)
    {
        int idUser = 0;
        if (Request.IsAuthenticated)
        {
            var membership = (WebMatrix.WebData.SimpleMembershipProvider)Membership.Provider;
            idUser = membership.GetUserId(User.Identity.Name);
        }

        var musicas = storeDB.Musicas.Where(x => x.MusicaId == musicaID)
                                     .Select(x => new { x.Nome, x.NomeArtista, x.genero, x.path })
                                     .ToList().First();

        var y = new UsuarioMusica()
        {
            UserId = idUser,
            MusicaId = musicaID,
            GeneroId = musicas.genero.GeneroId,
            genero = musicas.genero,
            Nome = musicas.Nome,
            NomeArtista = musicas.NomeArtista,
            path = musicas.path
        };
        if (ModelState.IsValid)
        {

            storeDB.UsuarioMusicas.Add(y);
            storeDB.SaveChanges();

        }

        return View(id);
    }
    else
    {
        return View("Error");
    }
}

我想在这一行列出 id 的列表:

int musicaID = storeDB.OrderDetails.Where(o => o.OrderId == id)
                                   .Select(o => o.MusicaId).FirstOrDefault();

然后,我需要将每个 ID 添加到数据库中。

我认为我需要用列表musicaID 创建一个foreach,但我不知道如何传递每个 ID 以添加到数据库中。

其实这个方法只是添加第一个元素,我知道为什么,是因为FirstOrDefault方法。

如何更改此设置以添加多个 ID?

【问题讨论】:

  • 您是否有一个只包含 ID 列的表格,或者您是否有需要添加到表格中的带有 ID 的项目?
  • orderDetails表中,有OrderDetailId、OrderId和MusicaId列,其中每个订单可以有多个音乐,所以OrderDetail表做了order和music表的关系,明白吗?
  • 目前,如果一个订单添加了两首音乐,我只是在数据库中添加第一首音乐,第二首不添加。

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


【解决方案1】:

您必须使用 foreach 循环并在添加所有元素时保存您的更改。比如这样:

public ActionResult Complete(int id)
{
    // Validate customer owns this order
    bool isValid = storeDB.Orders.Any(
        o => o.OrderId == id &&
        o.Username == User.Identity.Name);

    bool CheckOrderValue = storeDB.Orders.Any(o => o.OrderId == id && o.Total == 0);

    if (isValid && CheckOrderValue)
    {
        int idUser = 0;
        if (Request.IsAuthenticated)
        {
            var membership = (WebMatrix.WebData.SimpleMembershipProvider)Membership.Provider;
            idUser = membership.GetUserId(User.Identity.Name);
        }

        var musicaIDs = storeDB.OrderDetails.Where(o => o.OrderId == id).Select(o => o.MusicaId).ToList();

        foreach (var musicaId in musicaIDs)
        {
            var musicas = storeDB.Musicas.Where(x => x.MusicaId == musicaId)
                .Select(x => new { x.Nome, x.NomeArtista, x.genero, x.path }).ToList().First();

            var y = new UsuarioMusica()
            {
                UserId = idUser,
                MusicaId = musicaID,
                GeneroId = musicas.genero.GeneroId,
                genero = musicas.genero,
                Nome = musicas.Nome,
                NomeArtista = musicas.NomeArtista,
                path = musicas.path
            };

            if (ModelState.IsValid)
            {
                storeDB.UsuarioMusicas.Add(y);
            }
        }

        storeDB.SaveChanges();

        return View(id);
    }
    else
    {
        return View("Error");
    }
}

【讨论】:

  • 这似乎完全符合 OP 的建议。 +1(前提是他正确地表达了他的问题,这是可疑的)。这可以通过将 musicaIDs 查询与 musicas 查询结合并循环进行优化。
  • 感谢@PawelMaga,只需在您的解决方案中将 int musicaIDs 更改为 List musicaIDs
  • 啊,抱歉,我没有注意到这一行。 @paqogomez 我同意它可以通过许多其他方式完成,但这与问题无关。
  • @PedroHenrique 很高兴你找到了答案,Pawal 做得很好。我只是建议进行优化,这就是为什么它是评论而不是答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2019-03-01
  • 1970-01-01
  • 2016-02-20
  • 2023-02-24
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多