首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >慢查询实体框架

慢查询实体框架
EN

Stack Overflow用户
提问于 2014-02-13 11:34:49
回答 2查看 504关注 0票数 1

我注意到我对实体框架的一个查询太慢了。我认为问题是我使用的是包含,但我没有得到“任何”的速度差异。我正在执行这个查询的表有大约4k个条目,所以我不明白为什么要花20秒才能做到这一点。我正在使用mysql与最新的.net连接器。

代码语言:javascript
复制
var errorMessages = msgs.Where(m => m.Type == 1 && 
            (m.StatusCode == (int)ErrorCode.AbsentSubscriber || 
             m.StatusCode == (int)ErrorCode.AbsentSubscriber || 
             m.StatusCode == (int)ErrorCode.Deleted ||
             m.StatusCode == (int)ErrorCode.Error ||
             m.StatusCode == (int)ErrorCode.Expired ||
             m.StatusCode == (int)ErrorCode.InvalidDestination ||
             m.StatusCode == (int)ErrorCode.Rejected ||
             m.StatusCode == (int)ErrorCode.SubscriberError ||
             m.StatusCode == (int)ErrorCode.Undeliverable ||
             m.StatusCode == (int)ErrorCode.UnknownSubscriber))
            .GroupBy(m => m.StatusCode);

foreach (var error in errorMessages)
{
    var eSum =
            db.ErrorSumMessages.SingleOrDefault(
                m => m.ErrorCode == error.Key 
                && m.MessagesId == oldHourlyMessage.MessagesId);

    if (eSum != null)
    {
        //This gets called
        eSum.Count += error.Sum(m => m.MessageCount);
        db.Entry(eSum).Property(m => m.Count).IsModified = true;
    }
    else
    {
        db.ErrorSumMessages.Add(new ErrorSumMessage
            {
                Count = error.Sum(m => m.MessageCount),
                ErrorCode = error.Key,
                ErrorText = error.First().StatusText,
                MessagesId = oldHourlyMessage.MessagesId
            });
    } 
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-13 11:48:21

在您的代码中,在每一次称为db查询- db.ErrorSumMessages.SingleOrDefault的迭代中。如果errorMessages包含4K记录,您将得到4K查询!

若要减少db查询的数目,请在foreach语句之前选择必需(或全部) db.ErrorSumMessages:

代码语言:javascript
复制
var localErrorSumMessages = db.ErrorSumMessages.ToList();
foreach (var error in errorMessages)
{
   var eSum = localErrorSumMessages.SingleOrDefault(....); // selecting from collection in memory
票数 2
EN

Stack Overflow用户

发布于 2014-02-13 13:39:02

请确保您还在主查询中查询ErrorSumMessages

代码语言:javascript
复制
var errorMessages = msgs.Where(...)
            .GroupBy(m => m.StatusCode)
            .Select(g => new 
                 { 
                   StatusCode = g.Key,
                   eSum = db.ErrorSumMessages
                            .FirstOrDefault(
                            m => m.ErrorCode == g.Key 
                              && m.MessagesId == oldHourlyMessage.MessagesId),
                   Messages = g
                 })

foreach(var row in errorMessages)
{
    var eSum = row.eSum;
    var error = row.Messages;
    // rest should work unaltered, except error.Key => row.StatusCode
    ...

}

您必须使用FirstOrDefault,否则EF将抛出“方法‘单’和'SingleOrDefault‘只能用作最后的查询操作”。

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

https://stackoverflow.com/questions/21753052

复制
相关文章

相似问题

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