2016-01-07 146 views
1

我得到了一個包含成員的數據庫,每個成員都有一個他們所做的運動列表。 現在我想遍歷一個列表框,並將每個選定的項目添加到我的數據庫。將列表添加到SQL數據庫(實體數據庫)

這是我的數據庫:

enter image description here

這是我的代碼:

foreach (var item in sportCheckedListBox.CheckedIndices) 
      { 
       int sportindex = Convert.ToInt32(item.ToString()) + 1; 
       var queryResult = from sp in context.Sports 
            where sp.sportnr == sportindex 
            select sp; 
       foreach (var sport in queryResult) 
       { 
        myMember.Sports.Add(sport); 
       } 
      } 

這看起來有點 '黑幕',我怎麼能做到這一點更好?

回答

0

我肯定會做的一件事是將查詢移出循環。出於性能和可維護性原因,查詢不應存在於循環中。 LINQ知道如何翻譯一個(new int[] { 0, 1, 2, ... }).Contains(column)構建成WHERE column IN (0, 1, 2, ...)聲明,所以我們使用:

// Get all checked items together 
var lookupIndices = sportCheckedListBox.CheckedIndices.Select(i => Convert.ToInt32(item.ToString()) + 1); 

// Find all matching sport numbers 
var queryResult = from sp in context.Sports 
        where lookupIndices.Contains(sp.sportnr) 
        select sp; 

// Now loop over the results 
foreach (var sport in queryResult) 
{ 
    myMember.Sports.Add(sport); 
} 

// save changes 
0

我覺得你可以做AddRange

myMember.Sports.AddRange(queryResult); 
myMember.Sports.SaveChanges() 

您可能需要隱蔽queryResultIEnumerable類型,如果它尚未雖然。

+0

QueryResult中不是一個列表,因此不具有的AddRange()。 –

0

你的方法沒有什麼根本錯誤,但你可以用Linq更簡潔地實現它。

而不是你foreach循環的,如果你總是想要分配一個新的列表,你可以使用

myMember.Sports = queryResult.ToList(); 

如果要改爲串聯結果到現有的列表,你可以使用

myMember.Sports = myMember.Sports.Concat(queryResult.ToList()); 

如果您想要做與上面相同的操作,但沒有任何重複項(由您添加的對象定義),請改爲

myMember.Sports = myMember.Sports.Union(queryResult.ToList());