从IEnumerable中选择项目

时间:2012-04-23 16:11:38

标签: c# linq

  

可能重复:
  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条记录。

6 个答案:

答案 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不支持。