从 IEnumerable 中选择项目

本文关键字:项目 选择 IEnumerable | 更新日期: 2023-09-27 18:32:09

可能的重复项:
查询结果不能枚举多次?

我正在使用实体框架通过存储过程从我的数据库中选择和返回一组实体。

var results = dataContext.loadData(testargument);

我想计算这个返回的集(以确保只返回 1 条记录,然后获取此列表中的第一项。

if(results.Count() == 1)
{
    ReturnedEntity entity = results.First();
}

但是,当我执行此调用时,我收到错误"查询结果不能枚举多次"。有谁知道我如何正确地做到这一点?我假设调用 Count() 方法正在更改数据,并且不确定在调用 first() 方法之前是否需要将其放回列表中。我已经尝试了结果。ToList()。First() 但得到相同的错误。

此外,我注意到如果我在空集上调用 First() 方法,我会收到一个错误,这就是我试图确保只返回 1 条记录的原因。

从 IEnumerable 中选择项目

您可以使用

ToList()来避免此问题。然后,当您将列表加载到内存中时,您可以做任何您想做的事情。但我建议你使用FirstOrDefault().

var results = dataContext.loadData(testargument).ToList();

ReturnedEntity entity = results.FirstOrDefault();

if(results.Length == 1)
    ReturnedEntity entity = results.First();

返回的实体实体 = 结果。第一();

if (实体 != 空)

尝试在获取计数之前调用.ToList(),因为这也会枚举结果。

var resultList = results.ToList();
if(resultList.Count == 1)
{
    ReturnedEntity entity = resultList.First();
}
var resultList = results.ToList();
if(resultList.Count == 1)
{
    ReturnedEntity entity = resultList.First();
}

IEnumerable不支持这一点。这是设计使然。 IEnumerable使用惰性求值在您需要之前获取您要求的元素。

如果你想知道项目的数量而不迭代它们,你可以使用 IList<T> ,它有一个 Count 属性。

我认为

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