0

使用 EF 时,ObjectContext我看到两个不同的扩展方法具有相同的签名作为连续选择。对我来说,根据我选择的一个魔术导致其中一个或另一个被跟注,这对我来说没有意义,那么实际上发生了什么?

在此处输入图像描述

4

1 回答 1

5

我假设这Campaigns是一个实例DbSet<Campaign>DbSetinherits DbQuery,它实现IOrderedQueryable,其定义是:

public interface IOrderedQueryable<out T> : IQueryable<T>, 
    IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable

如您所见,IQueryable<T>IEnumerable<T>都已实现,但 的定义IQueryable表明它扩展了IEnumerable

public interface IQueryable : IEnumerable

所以基本上,扩展方法是为 实现的IEnumerable,但它也可以从IQueryable它扩展原始接口中获得。Intellisense 选择了这两个选项,因为您最终可能会隐式或显式地将类型转换为IEnumerable.

实际运行的方法取决于调用它的类型。例如,在您的方法Campaigns实例上DbSet<Campaign>,它将(如果您使用 MS SQL)转换为SELECT TOP 1...查询,但如果您在 上调用它Campaigns.ToList(),即IEnumerable,它将返回零索引处的项目。每种类型的扩展方法的实现都不同。

希望这是有道理的:)

于 2012-07-07T23:22:04.123 回答