首先看看继承关系
public abstract class DbSet : DbQuery
public abstract class DbQuery : IOrderedQueryable, IQueryable, IEnumerable, IListSource
public interface IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable
再看这段代码:
定义了Members:
public DbSet<Member> Members { get; set; }
之后为某变量赋值:
IEnumerable<Member> listA = Members;
然后我Where了
listA.Where(entity=>entity.Name.Equals("aa"));
但这个Where调用的却是IEnumerable<T>中的Where,虽然我这边用了父接口来定义的变量,但我却是想使用IQueryable<T>中的Where。多态呢?多态去哪了呢?好吧,这只不过是重载。
来看下IEnumerable<T>与IQueryable<T>对于Where方法的定义:
IEnumerable<T>:
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
IQueryable<T>:
然后它又利用.net的新特性扩展方法:
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
而且这些个扩展方法都是static静态的重载。
最后,我只想说这个扩展方法的新特性只不过是看起来很美而已。