3

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

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

var results = dataContext.loadData(testargument);

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

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

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

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

4

6 回答 6

3

You can avoid this problem using ToList(). Becuase then when you have the list loaded in your memory you can do whatever you want. But I reccomend you use FirstOrDefault().

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

And

ReturnedEntity entity = results.FirstOrDefault();

Or

if(results.Length == 1)
    ReturnedEntity entity = results.First();
于 2012-04-23T18:14:20.117 回答
0

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

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

于 2012-04-23T18:17:30.710 回答
0

ReturnedEntity 实体 = results.First();

如果(实体!= null)

于 2012-04-23T16:13:15.023 回答
0

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

var resultList = results.ToList();
if(resultList.Count == 1)
{
    ReturnedEntity entity = resultList.First();
}
于 2012-04-23T16:13:32.060 回答
0
var resultList = results.ToList();
if(resultList.Count == 1)
{
    ReturnedEntity entity = resultList.First();
}
于 2012-04-23T16:15:26.043 回答
-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不支持。

于 2012-04-23T16:14:08.707 回答