首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么does ()运算符会降级实体框架的Linq查询?

为什么does ()运算符会降级实体框架的Linq查询?
EN

Stack Overflow用户
提问于 2012-12-01 05:17:48
回答 1查看 2.6K关注 0票数 1

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

在SQL中将Contains转换为"WHERE“,从而导致性能下降”。

现在,我有将近10个表有10列,在获取记录时,我使用Contains为近8列。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-01 08:16:22

是的,包含()将严重降低性能。

以便您可以尝试下面提到的解决方案.

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

概述:

  1. 在Server中创建一个表,例如,带有Guid数据类型的HelperForContainsOfIntType和int数据类型列的HelperID的ReferenceID。根据需要使用不同数据类型的ReferenceID创建不同的表。
  2. 在EF模型中为HelperForContainsOfIntType和其他此类表创建实体/HelperForContainsOfIntType。根据需要为不同的数据类型创建不同的实体/ EntitySet。
  3. 在.NET代码中创建一个助手方法,它接受一个IEnumerable的输入并返回一个Guid。此方法生成一个新的Guid,并将来自IEnumerable的值与生成的Guid一起插入到HelperForContainsOfIntType中。接下来,该方法将这个新生成的Guid返回给调用者。为了快速插入HelperForContainsOfIntType表,创建一个存储过程,它接受值列表的输入并进行插入。见Server 2008中的表值参数(ADO.NET)。为不同的数据类型创建不同的帮助程序,或者创建一个通用的助手方法来处理不同的数据类型。

创建一个EF编译查询,类似于如下所示:

代码语言:javascript
复制
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 
    );

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

代码语言:javascript
复制
var containsHelperID = dbHelper.InsertIntoHelperForContainsOfIntType(new int[] { 1, 2, 3 });
var result = _selectCustomers(_dbContext, containsHelperID).ToList();

我从这里那里得到的

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13656623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档