使用EF ObjectContext
时,我看到两种不同的扩展方法,其签名与连续选择相同。对我来说没有意义的是,根据我选择的那个,会有一些魔法导致一个或另一个被调用,那么实际发生了什么?
答案 0 :(得分:5)
我假设Campaigns
是DbSet<Campaign>
的实例? DbSet
继承DbQuery
,其实现IOrderedQueryable
,definition为:{/ p>
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()
上调用它1}},即IEnumerable
,它将返回零索引处的项目。每种类型的扩展方法的实现都不同。
希望有道理:)