C# 为什么我们需要使用AsEnumerable()方法?
此代码导致NotSupportedExceptionC# 为什么我们需要使用AsEnumerable()方法?,c#,linq,lambda,ef-code-first,C#,Linq,Lambda,Ef Code First,此代码导致NotSupportedException var detailList = context.Details.Where(x => x.GetType().GetProperty("Code").GetValue(x,null).ToString() == "00101").ToList(); 但是这个代码是有效的 var detailList = context.Details.AsEnumerable().Where(x => x.GetType().GetP
var detailList = context.Details.Where(x => x.GetType().GetProperty("Code").GetValue(x,null).ToString() == "00101").ToList();
但是这个代码是有效的
var detailList = context.Details.AsEnumerable().Where(x => x.GetType().GetProperty("Code").GetValue(x,null).ToString() == "00101").ToList();
MSDN说:
那么为什么我们需要使用AsEnumerable()方法呢?
DbSet
也是IQueryable
IQueryable
有自己的一组LINQ扩展方法,可以将表达式树转换为SQL,并且不支持反射
通过调用AsEnumerable()
,可以将表达式的编译时类型更改为IEnumerable
,强制扩展方法绑定到标准LINQ方法
如果希望在服务器上运行查询,则应构建表达式树,而不是使用反射。
DbSet
也是IQueryable
IQueryable
有自己的一组LINQ扩展方法,可以将表达式树转换为SQL,并且不支持反射
通过调用AsEnumerable()
,可以将表达式的编译时类型更改为IEnumerable
,强制扩展方法绑定到标准LINQ方法
如果希望在服务器上运行查询,则应构建表达式树,而不是使用反射。第一个查询尝试让查询提供程序将查询转换为SQL并对数据库执行查询。它无法创建有效的数据库查询,因此失败并出现上述错误
使用
AsEnumerable
静态地将查询键入IEnumerable
,而不是IQueryable
,因此最终调用查询方法的LINQ to objects版本,将整个表拉入内存,然后在应用程序中执行所有操作。第一个查询尝试让查询提供程序将查询转换为SQL并对数据库执行查询。它无法创建有效的数据库查询,因此失败并出现上述错误
使用
AsEnumerable
静态地将查询键入IEnumerable
,而不是IQueryable
,因此最终调用查询方法的LINQ to objects版本,将整个表拉入内存,然后在应用程序中执行所有操作。当您查询IQueryable
时,您的方法将通过表达式树
转换为SQLAsEnumerable
将编译时类型更改为IEnumerable
,并将数据库中的所有实体放入内存,在内存中,当查询IQueryable
时,可以通过LINQ to Objects
通过反射查询它们,您的方法通过表达式树
转换为SQLaseneumerable
将编译时类型更改为IEnumerable
,并将数据库中的所有实体放入内存,在内存中,您可以通过LINQ to Objects
通过反射查询它们,而您可以只使用var detailList=context.Details.where(x=>x.code.ToString()==“00101”).ToList();
?当你可以使用var detailList=context.Details.Where(x=>x.code.ToString()==“00101”).ToList();
?你的解释不是那么容易理解(很多术语),但我喜欢它(+1)。一些新的东西不是标准答案。你的解释不是那么容易理解(很多术语)但我喜欢(+1)。一些新的东西不是标准答案。