如果你有一个方法返回一个IEnumerable
但是在内部返回IQueryable
将返回一个IEnumerable
强制执行,即使IQueryable
推迟执行?
public IEnumerable<Customer> Customers()
{
IEnumerable<Customer> customers = null;
try
{
customers = from c in GetCustomers // IQueryable
where c.Name=="JO"
select c;
}
catch (SqlException ex)
{
}
return customers;
}
答案 0 :(得分:3)
您返回的结果将是一个可枚举的,并将推迟执行,直到您开始枚举它。但是,与IQueryable不同,它不会被任何进一步的操作改变。
例如,如果您之后执行了.Sum()
之类的操作,它将在本地计算机上执行,而IQueryable可以将Sum()
发送到远程数据库或Web服务。
答案 1 :(得分:1)
由于IQueryable
实现了IEnumerable
,因此在返回对象时,您不会强制执行任何操作。
答案 2 :(得分:1)
首先,IQueryable<T>
实现IEnumerable<T>
,因此您不会在此处“强制”任何内容,因为只会返回IQueryable<T>
,无需进行评估。
其次,IEnumerable<T>
通常也会被懒惰地评估(通过.ToArray()
,.ToList()
,foreach()
等。
答案 3 :(得分:0)
在执行以下任一操作(但不限于)之前,您不会强行执行:
ToList()
FirstOrDefault()
在物理上需要集合之前,代码不会执行;例如作为数据源。
答案 4 :(得分:0)
您不会强制执行,因为IQueryable
和IEnumerable
都被懒惰地评估,并且IQueryable实现了IEnumerable,因此不需要进行任何转换。
如果您的体系结构在这种情况下调整得不好,这实际上会产生问题 - 返回的IQueryable
仅在评估结果后(即迭代结果时)执行查询。如果此时数据库连接已关闭,您将收到异常。