进行分组的有效方法,然后连接到来自不同上下文/db的数据

本文关键字:上下文 db 数据 连接 有效 方法 然后 | 更新日期: 2023-09-27 18:21:04

给定来自不同数据库的以下对象,将它们与LinQ语句连接并按QID和SectionID分组的最有效方法是什么。理想情况下,它们当然应该在同一个DB中,但我必须处理这个问题。使用EF6,为每个数据库分离上下文。

每个问题可以有多个用户答案,在与UserAnswer相同的DB中还有一个TestResult对象,因此查询从其导航属性开始。

用户回答

线路ID[PK]

string应答

国际QID

Int SectionID

问题

int QID[PK]

SectionID[FK]

字符串问题文本

其他属性,我希望投影到匿名类型第一

下面这样的方法应该有效,但我只是想知道是否有比执行下面所有查询更有效的方法。

   var ColOfQDataForQ = Test.TestSections.SelectMany(x => x.TestQuestions.Select(q => new {q.QID, q.SID, AllMustBeCorrect = q.AllMustBeCorrect ?? false, Points = q.Points ?? 1, q.QuestionType, q.QuestionChoices }));

    var ColOfUaByQgroups =       from userAnswer in TestResult.UserAnswers
                      group userAnswer by userAnswer.QID into AnswersByQuestionCollection
                      select new { AnswersByQuestionCollection, QID =AnswersByQuestionCollection.First().QID };
    var ColOfUaAndQdataJoin = from UaByQgroup in ColOfUaByQgroups join  QData in ColOfQDataForQ
                        on UaByQgroup.QID equals QData.QID select new { Qdata = QData, UserAnswers = UaByQgroup.AnswersByQuestionCollection, SID = QData.SID, QID = QData.QID };
    var ColOfUaQdataJoinGroupedBySec = from UaQdJoin in ColOfUaAndQdataJoin group
                UaQdJoin by UaQdJoin.SID into UaQdJoinBySec
                select new { UaQdJoinBySec, SID = UaQdJoinBySec.First().SID};

进行分组的有效方法,然后连接到来自不同上下文/db的数据

如果你有足够的RAM来存储数据,一种计算效率高的方法,就数据库往返而言,是将第一个数据库中的一个表或连接表读取到Dictionary对象中,然后在LINQ中将其引用到第二个数据库,类似于:

var questions = db1.Questions.ToDictionary(x => x.QID);
var result = db2.UserAnswers
    .Select(x => new { Question = questions[x.QID], Answer = x })
    .Select(x => new { x.Question.QID, x.Question.QuestionText, x.Answer.LineId }); //etc.