Linq Query需要很长时间

时间:2014-01-15 09:42:59

标签: c# linq entity-framework entity-framework-5

以下是长期的 -

using (var db = new Agreements_DBEntities())
{

    bool isProfileExist = (from ua in db.UserAgreementDetails
                                     where ua.uID == uID &&
                                           ua.uMailId == uMailId &&
                                           ua.uType == uType &&
                                           ua.UProfile.HasValue && ua.UProfile.Value
                                     select true).Any();
}
bool isProfileExist以上

花了太长时间......它有什么问题?

2 个答案:

答案 0 :(得分:1)

我想你可以删除where子句并直接使用Any(我不确定IQueryable提供程序将如何优化Linq)以及你如何对它进行基准测试但是:

db.UserAgreementDetails.Any(ua => ua.uID == uID &&
                                           ua.uMailId == uMailId &&
                                           ua.uType == uType &&
                                           ua.UProfile.HasValue && ua.UProfile.Value);

即使这样,你在db中有多少行?这是第一次执行查询等。?

答案 1 :(得分:1)

要做的第一件事是检查生成的实际查询。 SQLServer Profiler非常适用于此,其他数据库还有其他查询记录方法。

如果我们将查询的不必要位简化为:

,可能会产生更好的SQL
bool isProfileExist = db.UserAgreementDetails.Any(
    ua => ua.uID == uID &&
    ua.uMailId == uMailId &&
    ua.uType == uType &&
    ua.UProfile.HasValue &&
    ua.UProfile.Value);

我想这会产生几乎相同的代码,但它可能不会,如果查询提供程序给出了一些奇怪的东西,那值得尝试。

在那之后,我猜(但不能确定)主要罪魁祸首实际上是数据库服务器。检查您是否有一个索引或索引集使这个查询快速执行。

构思索引可能会涵盖与uIDuMailIduTypeUProfile对应的列,或者包含其中一些和“拥有”的列其他。但是,人们不需要单独考虑这个查询,所以你可能会决定对它们进行单独的索引,或者只是覆盖一些索引的索引会做:特别是,如果只有少量的行具有相同的{{ 1}},然后一个正好应该完成工作的索引,不需要增加插入成本,也可以使更多的其他查询受益。