1

我在这里读到,在实体框架中,如果您执行包含操作,它会降低性能:

包含在 SQL 中转换为“WHERE IN”,导致性能下降”

现在我有近 10 个表有 10 列,并且在获取记录时我使用包含近 8 列。

我的问题是真的吗?如果是的话,替代方案是什么?

4

1 回答 1

3

的 Contains() 会严重降低性能。

所以你可以尝试下面提到的解决方案。

我们能够通过添加一个中间表并从需要使用 Contains 子句的 LINQ 查询连接到该表来解决 EF Contains 问题。通过这种方法,我们能够获得惊人的结果。我们有一个大型 EF 模型,并且由于在预编译 EF 查询时不允许使用“包含”,因此使用“包含”子句的查询的性能非常差。

概述:

  1. 在 SQL Server 中创建一个表 - 例如 HelperForContainsOfIntType,其 HelperID 为 Guid 数据类型,ReferenceID 为 int 数据类型列。根据需要创建具有不同数据类型的 ReferenceID 的不同表。

  2. 在 EF 模型中为 HelperForContainsOfIntType 和其他此类表创建一个实体/实体集。根据需要为不同的数据类型创建不同的 Entity / EntitySet。

  3. 在 .NET 代码中创建一个辅助方法,该方法接受 IEnumerable 的输入并返回一个 Guid。此方法生成一个新的 Guid,并将 IEnumerable 中的值与生成的 Guid 一起插入到 HelperForContainsOfIntType。接下来,该方法将这个新生成的 Guid 返回给调用者。为了快速插入 HelperForContainsOfIntType 表,创建一个存储过程,它接受值列表的输入并执行插入。请参阅SQL Server 2008 (ADO.NET) 中的表值参数。为不同的数据类型创建不同的助手或创建一个通用的助手方法来处理不同的数据类型。

创建一个类似于以下内容的 EF 编译查询:

static Func<MyEntities, Guid, IEnumerable<Customer>> _selectCustomers =
    CompiledQuery.Compile(
        (MyEntities db, Guid containsHelperID) =>
            from cust in db.Customers
            join x in db.HelperForContainsOfIntType on cust.CustomerID equals x.ReferenceID where x.HelperID == containsHelperID
            select cust 
    );

使用要在 Contains 子句中使用的值调用 helper 方法,并获取要在查询中使用的 Guid。例如:

var containsHelperID = dbHelper.InsertIntoHelperForContainsOfIntType(new int[] { 1, 2, 3 });
var result = _selectCustomers(_dbContext, containsHelperID).ToList();

我从这里得到的

于 2012-12-01T08:16:22.097 回答