PLINQ to Entity Framework:为什么不应该使用它?
PLINQ to Entity Framework: why shouldn't it be used?
我在某处读到您不应该在 Entity Framework 或 SQL 上使用 PLINQ。我不记得我在哪里读到它或原因是什么,但我做了一些实验。使用传统的 LINQ to Entity Framework 加载预计会变得非常大的数据库 table 目前需要 12 到 13 毫秒。但是,当我添加 .AsParallel() 时,相同的查询会在 2 到 4 毫秒内运行,并且得到完全相同的结果。
因此,如果我使用 PLINQ 更快地获得相同的结果,那么使用 PLINQ 的缺陷是什么 Entity Framework?
存在一些危险,IE DbContext不能被多线程同时访问。而且通常没有什么好处,即 PLINQ 将同步访问 IEnumerable.MoveNext(),它完成读取数据、创建实体和与更改跟踪器交互的所有工作。
但是,如果您对返回的实体进行了大量工作,但不涉及 DbContext(即没有 SaveChanges()、没有延迟加载等),您可以使用 PLINQ。
但我能想到的大多数示例都可以通过将操作构建到原始查询中或通过执行服务器端原始 SQL.
得到更好的优化
因此,如果您有一堆 CPU 密集型域逻辑,您需要 运行 跨实体集合,您可以并行操作结果,但您可能会更好-在并行执行块 中创建一个单独的 DbContext 。
我在某处读到您不应该在 Entity Framework 或 SQL 上使用 PLINQ。我不记得我在哪里读到它或原因是什么,但我做了一些实验。使用传统的 LINQ to Entity Framework 加载预计会变得非常大的数据库 table 目前需要 12 到 13 毫秒。但是,当我添加 .AsParallel() 时,相同的查询会在 2 到 4 毫秒内运行,并且得到完全相同的结果。
因此,如果我使用 PLINQ 更快地获得相同的结果,那么使用 PLINQ 的缺陷是什么 Entity Framework?
存在一些危险,IE DbContext不能被多线程同时访问。而且通常没有什么好处,即 PLINQ 将同步访问 IEnumerable.MoveNext(),它完成读取数据、创建实体和与更改跟踪器交互的所有工作。
但是,如果您对返回的实体进行了大量工作,但不涉及 DbContext(即没有 SaveChanges()、没有延迟加载等),您可以使用 PLINQ。
但我能想到的大多数示例都可以通过将操作构建到原始查询中或通过执行服务器端原始 SQL.
得到更好的优化因此,如果您有一堆 CPU 密集型域逻辑,您需要 运行 跨实体集合,您可以并行操作结果,但您可能会更好-在并行执行块 中创建一个单独的 DbContext 。