对linq到sql查询的迭代非常慢

时间:2010-06-16 10:17:16

标签: linq-to-sql c#-4.0

我有一个视图,我的数据库中的AdvertView,这个视图是一些表(广告,客户,属性)之间的简单连接。然后我有一个简单的linq查询来获取客户的所有广告:

public IEnumerable<AdvertView> GetAdvertForCustomerID(int customerID)
{
    var advertList = 
        from advert in _dbContext.AdvertViews
        where advert.Customer_ID.Equals(customerID)
        select advert;
    return advertList;
}

然后我希望将它映射到我的MVC应用程序的modelItems:

public List<AdvertModelItem> GetAdvertsByCustomer(int customerId)
{
    List<AdvertModelItem> lstAdverts = new List<AdvertModelItem>();
    List<AdvertView> adViews = _dataHandler.GetAdvertForCustomerID(customerId).ToList();
    foreach(AdvertView adView in adViews)
    {
        lstAdverts.Add(_advertMapper.MapToModelClass(adView));
    }
    return lstAdverts;
}

我希望SQL有一些性能问题,但问题似乎是.ToList()函数。我正在使用ANTS性能分析器,它报告该函数的总运行时间为1.400毫秒,其中850个与ToList()。所以我的问题是,为什么托勒斯函数需要这么长时间?

2 个答案:

答案 0 :(得分:3)

GetAdvertForCustomerID不返回结果,它返回一个查询。

ToList枚举查询。结果在那时水合。数据库跳转发生在ToList调用中。

您应该获取生成的sql(通过使用SqlProfiler或DataContext.Log属性),并将其带到查询分析器以检查执行计划和IO(SET STATISTICS IO ON)。

答案 1 :(得分:1)

.ToList将执行查询,因此包括整个数据库的往返,获取数据,以及为返回的每条记录实现实体对象... ...您最有可能花费大部分时间db所以,仔细看看你的观点的执行计划。