以下是长期的 -
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
以上花了太长时间......它有什么问题?
答案 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非常适用于此,其他数据库还有其他查询记录方法。
如果我们将查询的不必要位简化为:
,可能会产生更好的SQLbool isProfileExist = db.UserAgreementDetails.Any(
ua => ua.uID == uID &&
ua.uMailId == uMailId &&
ua.uType == uType &&
ua.UProfile.HasValue &&
ua.UProfile.Value);
我想这会产生几乎相同的代码,但它可能不会,如果查询提供程序给出了一些奇怪的东西,那值得尝试。
在那之后,我猜(但不能确定)主要罪魁祸首实际上是数据库服务器。检查您是否有一个索引或索引集使这个查询快速执行。
构思索引可能会涵盖与uID
,uMailId
,uType
和UProfile
对应的列,或者包含其中一些和“拥有”的列其他。但是,人们不需要单独考虑这个查询,所以你可能会决定对它们进行单独的索引,或者只是覆盖一些索引的索引会做:特别是,如果只有少量的行具有相同的{{ 1}},然后一个正好应该完成工作的索引,不需要增加插入成本,也可以使更多的其他查询受益。