2013-09-29 61 views
1

我有一个约有1000行的People表和Dramas表,其中约有100行SQL Azure。这两个链接与外键Drama.PersonId,以便每个人可以有0或更多的戏剧。LINQ to Entities选择需要很长时间

下面的代码的行为与预期的一样,返回约50人及其相关的近期剧集。但是,运行需要超过5秒钟(以Stopwatch测量)。一定会有什么效率低下呢?

var people = ctx.People 
    .Where(p => p.Dramas.Any(d => d.DateHappened >= startDate)) 
    .Select(p => new 
    { 
     p.FirstName, 
     p.LastName, 
     Dramas = p.Dramas.Where(d => d.DateHappened >= startDate).Select(d => new { d.Id, d.DramaType }) 
    }).AsEnumerable(); 
+0

尝试延期加载,可能有帮助! – Imran

+0

我需要我的代码的下一行中的所有信息,所以我不认为懒加载会解决任何问题! – James

+0

然后尝试运行原始的sql查询。 http://forums.asp.net/t/1896474.aspx检查出来可能会帮助你! – Imran

回答

0

我通过首先获取所有最近的戏剧,然后发送一个单独的查询来获取人物,使得这更快。它使用PredicateBuilder

var dramasByPerson = ctx.Dramas.Where(d => d.DateHappened >= startDate) 
    .Select(d => new { d.PersonId, d.Id, d.DramaType }) 
    .ToLookup(d => d.PersonId); 

var predicate = dramasByPerson.Select(o => o.Key) 
    .Aggregate(
    PredicateBuilder.False<Person>(), 
    (current, personId) => current.Or(o => o.PersonId == personId) 
); 

var dictPeople = ctx.People.Where(predicate) 
    .Select(o => new { o.PersonId, o.LastName, o.FirstName }) 
    .ToDictionary(o => o.PersonId); 

var people = dramasByPerson.Select(o => new { 
    LastName = people[o.Key].LastName, 
    FirstName = people[o.Key].FirstName, 
    Dramas = o.Select(d => new { d.Id, d.DramaType }) 
});