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