为什么我们需要使用AsEnumerable()方法?

ram*_*_rp 1 c# linq lambda ef-code-first

此代码导致NotSupportedException.

var detailList = context.Details.Where(x => x.GetType().GetProperty("Code").GetValue(x,null).ToString() == "00101").ToList();
Run Code Online (Sandbox Code Playgroud)

但是这段代码可行.

    var detailList = context.Details.AsEnumerable().Where(x => x.GetType().GetProperty("Code").GetValue(x,null).ToString() == "00101").ToList();
Run Code Online (Sandbox Code Playgroud)

MSDN说:

- AsEnumerable()返回输入为IEnumerable的输入

- DbSet是一个IEnumerable

那么为什么我们需要使用AsEnumerable()方法呢?

SLa*_*aks 7

DbSet也是IQueryable.

IQueryable 有自己的一组LINQ扩展方法,可以将表达式树转换为SQL,并且不支持反射.

通过调用AsEnumerable(),可以将表达式的编译时类型更改为IEnumerable<T>,从而强制扩展方法绑定到标准LINQ方法.

如果您更喜欢在服务器上运行查询,则应构建表达式树而不是使用反射.