可能重复:
The query results cannot be enumerated more than once?
我使用实体框架使用存储过程从我的数据库中选择并返回一组实体。
var results = dataContext.loadData(testargument);
我想计算这个返回的集合(以确保只返回1条记录,然后取出此列表中的第一项。
if(results.Count() == 1)
{
ReturnedEntity entity = results.First();
}
但是,当我执行此调用时,我收到错误“查询的结果不能多次枚举”。有谁知道我怎么能正确地做到这一点?我假设调用Count()方法正在更改数据,并且在调用first()方法之前我不确定是否需要将其放回列表中。我已经尝试过results.ToList()。First()但是得到了同样的错误。
另外我注意到如果我在空集上调用First()方法,我会收到错误,这就是为什么我要确保只返回1条记录。
答案 0 :(得分:3)
您可以使用ToList()
来避免此问题。因为当你在你的记忆中加载了列表时,你可以做任何你想做的事情。但我建议您使用FirstOrDefault()
。
var results = dataContext.loadData(testargument).ToList();
和
ReturnedEntity entity = results.FirstOrDefault();
或
if(results.Length == 1)
ReturnedEntity entity = results.First();
答案 1 :(得分:0)
ReturnedEntity entity = results.First();
if(entity!= null)
答案 2 :(得分:0)
在获取计数之前尝试调用.ToList()
,因为这也会枚举结果。
var resultList = results.ToList();
if(resultList.Count == 1)
{
ReturnedEntity entity = resultList.First();
}
答案 3 :(得分:0)
var resultList = results.ToList();
if(resultList.Count == 1)
{
ReturnedEntity entity = resultList.First();
}
答案 4 :(得分:0)
IEnumerable
不支持此功能。这是设计的。 IEnumerable
使用延迟评估来在您需要之前获取您要求的元素。
如果你想知道没有迭代它们的项目数量,你可以使用IList<T>
,它有一个Count属性。
答案 5 :(得分:-1)
我认为
try
{
var result = dataContext.loadData(testargument).Single()
}
catch (InvalidOperationException)
{
// Oops not a single result
}
是一种更好的方法,如果获得多于或少于一个结果是例外。如果在正常执行中出现多于或少于一个结果,则可以执行
var result = dataContext.loadData(testargument).SingleOrDefault()
if (result != null)
{
// Continue as usual
}
else
{
// Oops, not a single result
}
如果您将重复使用该套件,则可以使用ToList
扩展名
var results = dataContext.loadData(testargument).ToList();
if(results.Count == 1)
{
ReturnedEntity entity = results[0];
}
else
{
// Oops, not a single result
}
IList
支持多个枚举,具有Count
属性和索引访问者,IEnumerable
不支持。