使用 EF 时,ObjectContext
我看到两个不同的扩展方法具有相同的签名作为连续选择。对我来说,根据我选择的一个魔术导致其中一个或另一个被跟注,这对我来说没有意义,那么实际上发生了什么?
问问题
285 次
1 回答
5
我假设这Campaigns
是一个实例DbSet<Campaign>
?DbSet
inherits 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 回答