代码性能 - 填充视图的两个不同数据库中的数据

时间:2015-07-29 12:03:51

标签: c# asp.net-mvc performance entity-framework

基本上我有一个存储联系人的MVC网站,其中包含姓名,公司等各种信息,这些联系人访问各个地点的时间也会在单独的数据库中记录。

因此,联系人和访问权限保存在不同的数据库中。

我的MVC网站中有一个标签,显示用户联系人的个人资料,并且在个人资料上升到列表顶部的位置检测到他们的存在。

我已经建立了这个并且它的工作非常好。但是,对于大量的联系人,页面需要花费很长时间来填充它超时。所以这就是我的流程。

首先,我获取所有当前用户的联系人,并从数据中创建一个视图模型列表:

var model = DbContext.Contacts.Where(x => x.Organisation.Id == org.Id).ToList().Select(x => new AttendeeViewModel
        {
            Id = x.Id,
            LastName = x.LastName,
            FirstName = x.FirstName,
            Company = x.Company,
            Position = x.Position,
            DateJoined = x.DateJoined == Convert.ToDateTime("1900-01-01 00:00:00.000") ? DateTime.Now : x.DateJoined,
            lastVisit = findLastVisit(x)                
        }).ToList();

正如您在lastVisit中看到的那样,我调用了一个名为findLastVisit()的方法:

public Visit findLastVisit(Contact contact)
    {

        var date = DateTime.Now;

        var item = inboundContext.Visits.
                   Where(d => LocIds.Contains(d.LocationId) &&
                   d.ContactId == contact.Id &&
                   d.DateOfContact <= date)
                   .OrderByDescending(d => d.DateOfContact)
                   .FirstOrDefault();

        if (item != null)
        {
            return item;
        }
        else { return new Visit { }; }

    }

然后在视图中,我为每个配置文件显示此信息,基本上在列表中。因此,在加载页面时,整个列表应该首先填充页面。

所以我需要的基本功能流程是:

  • 从context1
  • 获取所有用户联系人
  • 使用来自context2
  • 的该联系人的上次记录访问创建视图模型

我已经测试过,问题是为列表中的每个联系人调用一次findLastVisit()方法。这是为每个联系人提取最后一次访问的过程,当数字过大时,这个过程需要很长时间才能完成。这是非常低效的......如果我忽略lastVisit数据,那么它加载速度非常快。

只是想知道是否有人能够看到更有效的方式来实现这一目标,或者我是否需要查看其他选项,例如在没有上次访问信息的情况下呈现视图以及用户通过单击其个人资料来显示此信息。

JK

1 个答案:

答案 0 :(得分:0)

对此大多数解决方案可能涉及拆分这些查询并制作WHERE部分,以便您查询每个数据库一次并且都具有ClientId列。然后你可以加入具有最终结果的ContactId列上的那些。

这可以在各个级别上完成,但是您可以尝试的一个简单更改与第二个查询中的内容非常相似 - LocIds.Contains(..):

1)从DbContext.Contacts中选择没有findLastVisit()调用的临时列表,

2)选择相关的clientId-s并将其传递给第二个查询

3)在Ids列表中选择客户的所有上次访问日期,并在结果中包含CLientID列

4)将ClientId列上的第一个查询和第二个查询结果加入到模型中。

注意:你没有提到你的意思是什么&#34;大量的联系人页面&#34;,但我假设这是一个&#34;页面&#34;在网络意义上,像10-100行。