使用IQueryable查询方法时返回IEnumerable

时间:2011-05-23 17:06:52

标签: c# linq-to-sql

如果你有一个方法返回一个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;
}

5 个答案:

答案 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)

您不会强制执行,因为IQueryableIEnumerable都被懒惰地评估,并且IQueryable实现了IEnumerable,因此不需要进行任何转换。

如果您的体系结构在这种情况下调整得不好,这实际上会产生问题 - 返回的IQueryable仅在评估结果后(即迭代结果时)执行查询。如果此时数据库连接已关闭,您将收到异常。