2012-10-17 106 views
3

过去几天我用LINQ querys表现挣扎:LINQ to SQL的一对多关系

LinqConnectionDataContext context = new LinqConnectionDataContext(); 
System.Data.Linq.DataLoadOptions options = new System.Data.Linq.DataLoadOptions(); 
options.LoadWith<Question>(x => x.Answers); 
options.LoadWith<Question>(x => x.QuestionVotes); 
options.LoadWith<Answer>(x => x.AnswerVotes); 
context.LoadOptions = options; 
var query =(from c in context.Questions 
      where c.UidUser == userGuid 
      && c.Answers.Any() == true 
      select new 
      { 
       c.Uid, 
       c.Content, 
       c.UidUser, 
       QuestionVote = from qv in c.QuestionVotes where qv.UidQuestion == c.Uid && qv.UidUser == userGuid select new {qv.UidQuestion, qv.UidUser }, 
       Answer = from d in c.Answers 
         where d.UidQuestion == c.Uid 
         select new 
         { 
          d.Uid, 
          d.UidUser, 
          d.Conetent, 
          AnswerVote = from av in d.AnswerVotes where av.UidAnswer == d.Uid && av.UidUser == userGuid select new { av.UidAnswer, av.UidUser } 
         } 
      }).ToList(); 

查询必须通过5000行中运行,它需要长达1分钟。我如何提高此查询的性能?

更新:

enter image description here

+0

存储过程?你用于JOIN的列和SQL端的WHERE子句的索引? – tranceporter

+0

更新我的问题与表格图片 – Timsen

+0

检查我的答案 – tranceporter

回答

1

让你开始的东西。

CREATE PROCEDURE GetQuestionsAndAnswers 
(
    @UserGuid VARCHAR(100) 
) 
AS 
BEGIN 

SELECT 
c.Uid, 
c.Content, 
c.UidUser, 
qv.UidQuestion, 
qv.UidUser, 
av.UidAnswer, 
av.UidUser, 
av.Content, 
d.Uid, 
d.UidUser, 
d.Content 
FROM Question c 
INNER JOIN QuestionVotes qv ON qv.UidQuestion = c.Uid AND qv.UidUser = @UserGuid 
INNER JOIN Answers d ON d.UidQuestion = c.Uid 
INNER JOIN AnswerVotes av ON av.UidAnswer = d.Uid AND av.UidUser = @UserGuid 
WHERE c.UidUser = @UserGuid 

END 

您将已经聚集在默认情况下主列的索引(刚刚证实这一点在你的数据库端),以及你希望非聚集索引上QuestionVote - UidUser柱,AnswerVote - UidUser列,答案 - UidQuestion列。

也看看这里。你可能想使用.AsQueryable()而不是ToList()延期执行

Do you ToList()?

+0

哦..快照...问题与这存储precidure是它创建内部连接,但我有什么是:问题和QuestionVotes有一对多的realtionship,与答案和AnswerVote – Timsen

+0

相同,那么你可以使用question.uid group. clause,answer.uid – tranceporter

1

经过了使用sql-debug-visualizer,然后复制生成的SQL和SQL客户端运行它,看看它是如何花费的时间生成的SQL。如果需要近1分钟,你需要通过添加索引和/或存储过程或创建视图等

到imporve在数据库级性能若以上没有采取太多的时间,你可以随时创建Stored Procedure and call that using LINQ to SQ L.

还有一个建议是使用实体框架if you can change to because这是未来。

+0

它几乎没有时间... – Timsen

+0

如何.ToToList是需要时间... – Timsen

+0

看到更新的答案... –