首先看看继承关系

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静态的重载。

 

最后,我只想说这个扩展方法的新特性只不过是看起来很美而已。

相关文章:

  • 2021-12-05
  • 2022-01-22
  • 2022-01-23
  • 2021-11-06
  • 2022-02-27
  • 2021-10-30
  • 2021-11-15
  • 2021-12-28
猜你喜欢
  • 2022-01-25
  • 2022-12-23
  • 2021-07-17
  • 2022-12-23
  • 2021-07-06
  • 2022-12-23
  • 2022-02-22
相关资源
相似解决方案