我有一个成员数据库,每个成员都有他们所做的运动列表。 现在我想循环一个列表框并将每个选定的项目添加到我的数据库中。
这是我的数据库:
这是我的代码:
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 :(得分:0)
我认为你可以做AddRange
:
myMember.Sports.AddRange(queryResult);
myMember.Sports.SaveChanges()
如果不是queryResult
类型,您可能需要将IEnumerable
转换为cl::Program::build()
类型。
答案 1 :(得分:0)
您的方法没有任何根本性的错误,但您可以使用Linq更简洁地实现它。
如果您总是想要分配新列表,而不是foreach
循环,则可以使用
myMember.Sports = queryResult.ToList();
如果您想将结果连接到现有列表,可以使用
myMember.Sports = myMember.Sports.Concat(queryResult.ToList());
如果您想要执行与上面相同的操作,但没有任何重复项(由您要添加的对象定义),而是
myMember.Sports = myMember.Sports.Union(queryResult.ToList());
答案 2 :(得分: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