2015-05-14 51 views
1

我有這樣的方法在數據庫中添加:獲取ID的列表,並使用LINQ

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添加到數據庫。

我認爲我需要做一個foreach列表musicaID,但我不知道如何通過每個ID添加到數據庫。

其實,這個方法是隻加入第一個元素,我知道爲什麼,是因爲FirstOrDefault方法。

如何更改此項以添加多個ID?

+1

您是否有隻包含ID列的表,或者您是否有需要添加到表中的ID的項? – Eckert

+0

在表順序詳細信息中,有OrderDetailId,OrderId和MusicaId列,其中每個訂單可以有多個音樂,所以OrderDetail表做的是訂單和音樂表的關係,明白嗎? –

+0

目前,如果訂單有兩個音樂添加,我只在數據庫中添加第一個音樂,而第二個音樂不添加。 –

回答

2

您必須使用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"); 
    } 
} 
+0

這似乎正是OP所暗示的。 +1(只要他正確地表達了他的問題,這是可疑的)。這可能可以通過將musicaID查詢與musicas查詢結合並循環來優化。 – paqogomez

+0

謝謝@PawelMaga,只需要在您的解決方案中更改int musicaID到列表 musicaIDs –

+0

啊,對不起,我沒有注意到這一行。 @paqogomez我同意可以用其他許多方式來完成,但這與問題無關。 –