Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我们需要使用AsEnumerable()方法?_C#_Linq_Lambda_Ef Code First - Fatal编程技术网

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

C# 为什么我们需要使用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

此代码导致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().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
时,您的方法将通过
表达式树
转换为SQL
AsEnumerable
将编译时类型更改为
IEnumerable
,并将数据库中的所有实体放入内存,在内存中,当查询
IQueryable
时,可以通过
LINQ to Objects
通过反射查询它们,您的方法通过
表达式树
转换为SQL
aseneumerable
将编译时类型更改为
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)。一些新的东西不是标准答案。