我已将我的MVC应用程序从linq-to-Sql迁移到EF 6.1.1,从.Net Framework 4.0迁移到4.5.1。我使用以下内容从列表中删除项目:
List<int> idsToKeep = new List<int>();
for (int i = 0; i < visit.Client.Count; i++)
{
Client om = visit.Client[i];
if (om.ClientId == 0)
continue;
bool itemExists = false;
foreach (int id in idsToKeep)
if (om.ClientId == id)
itemExists = true;
if (!itemExists)
{
visit.Client.RemoveAt(i);
i--;
}
}
return errors;
}
最初我收到了这个错误:
cannot apply indexing with to an expression of type system.collections.generic.iCollection
在这一行:
Client om = visit.Client[i];
将其更改为:
Client om = visit.Client.ElementAt(i);
我不确定这是否正确,但没有得到任何错误;问题是我无法解决此行中的RemoveAt:
visit.Client.RemoveAt(i);
非常感谢您的建议
答案 0 :(得分:0)
似乎visit.Client
是ICollection<T>
而RemoveAt
上没有ICollection<T>
方法。您可以尝试使用ToList
方法将其转换为列表,或者您可以使用linq排除所需的项目:
visit.Client = visit.Client.Where(x => x.ClientId == 0 ||
idsToKeep.Contains(x.ClientId)).ToList();
答案 1 :(得分:0)
试试这个,诀窍是你必须从下往上移除......
var visit = new Visit();
List<int> idsToKeep = new List<int>();
visit.Client.Reverse();
foreach(var thing in visit.Client){
Client om = thing;
if (om.ClientId == 0)continue;
bool itemExists = false;
foreach (int id in idsToKeep)
if (om.ClientId == id)
itemExists = true;
if (!itemExists)
{
visit.Client.Remove(thing);
}
}
return errors;