C# 使用IQueryable查询方法时返回IEnumerable
如果您有一个返回C# 使用IQueryable查询方法时返回IEnumerable,c#,linq-to-sql,C#,Linq To Sql,如果您有一个返回IEnumerable但在内部返回IQueryable的方法,那么即使IQueryable延迟执行,返回IEnumerable是否会强制执行 public IEnumerable<Customer> Customers() { IEnumerable<Customer> customers = null; try { customers = from c in GetCustomers // IQueryable
IEnumerable
但在内部返回IQueryable
的方法,那么即使IQueryable
延迟执行,返回IEnumerable
是否会强制执行
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;
}
public IEnumerable客户()
{
IEnumerable customers=null;
尝试
{
customers=来自GetCustomers//IQueryable中的c
其中c.Name==“JO”
选择c;
}
catch(SqlException-ex)
{
}
返回客户;
}
由于IQueryable
实现了IEnumerable
,当返回对象时,您将不会强制执行任何操作。首先,IQueryable
实现了IEnumerable
,因此您在这里并不是真的“强制”任何操作,因为IQueryable
将被返回,无需计算
其次,
IEnumerable
通常也是惰性地进行计算的(通过.ToArray()
,.ToList()
,foreach()
,等等)除非执行以下操作之一(但不限于此),否则不会强制执行:
ToList()
FirstOrDefault()
在实际需要集合之前,不会执行代码;e、 g.作为数据源。返回的结果将是可枚举的,并将推迟执行,直到开始枚举为止。但是,与IQueryable不同,它不会被任何进一步的操作所改变
例如,如果您随后执行了类似于
.Sum()
的操作,它将在本地计算机上执行,而IQueryable可能会将Sum()
发送到远程数据库或web服务。您不会强制执行,因为IQueryable
和IEnumerable
都是惰性计算的,IQueryable实现了IEnumerable,因此不需要进行任何转换
如果您的体系结构没有针对这种情况进行很好的调整,那么这实际上会带来一个问题-返回的IQueryable
仅在计算结果后(即迭代结果时)执行查询。如果此时数据库连接已关闭,则会出现异常。公共接口IQueryable:IEnumerable,IQueryable,IEnumerable