2014-12-19 75 views
0

我有一個問卷類,它的細節,問題和問題組。該結構是這樣的:如何使用LINQ獲得有序列表細節

enter image description here

創建詳細視圖,以顯示一Questionnaire和細節。細節應根據SequenceQuestionGroup中顯示。使用LINQ,如何獲得一個調查問卷,其中的細節按問題組中的順序排列。

到目前爲止,當我創建一個LINQ語法得到解決這個問題:

var questionnaire = db.Questionnaires 
    .Include(q => q.QuestionnaireDetails) 
    .FirstOrDefault(q => q.QuestionnaireID == questionnaireID); 

我有2個問題:

1)我不能叫IncludeQuestionQuestionGroup(立即加載)
.Include(q => q.QuestionnaireDetails.Question) < - 錯誤

錯誤:
Cannot convert lambda expression to type 'string' because it is not a delegate type

2)I不能通過Sequence調用OrderBy,呼叫.FirstOrDefault()之前我加入
.OrderBy(q => q.QuestionnaireDetails.Question.QuestionGroup.Sequence) < - 錯誤

錯誤:
'System.Collections.Generic.ICollection<MvcApplication1.Models.QuestionnaireDetail>' does not contain a definition for 'Question' and no extension method 'Question' accepting a first argument of type 'System.Collections.Generic.ICollection<MvcApplication1.Models.QuestionnaireDetail>' could be found (are you missing a using directive or an assembly reference?)

UPDATE

我試圖從溶液@ JesseJames,稍作修改:

var questionnaire = from qg in db.QuestionGroups 
        join q in db.Questions on qg.QuestionGroupID equals q.QuestionGroupID 
        join qd in db.QuestionnaireDetails on q.QuestionID equals qd.QuestionID 
        join qe in db.Questionnaires on qd.QuestionnaireID equals qe.QuestionnaireID 
        orderby qg.Sequence 
        select new Questionnaire { 
         QuestionnaireID = qe.QuestionnaireID, 
         Date = qe.Date, 
         Respondent = qe.Respondent, 
         QuestionnaireDetails = qe.QuestionnaireDetails }; 

但我有錯誤:

The entity or complex type 'MvcApplication1Model.Questionnaire' cannot be constructed in a LINQ to Entities query.

+0

? – 2014-12-19 03:15:04

+0

@RobertHarvey是的,我使用EF 6和ASP.NET MVC 5 – Willy 2014-12-19 03:15:31

+0

'db.Questionnaires'是否返回IEnumerable,IQueryable或ObjectQuery? – 2014-12-19 03:16:13

回答

1
var query = from qg in db.QuestionGroup 
      from q in db.Questions.Where(r=>r.QuestionGroupId == qg.QuestionGroupId) 
      from qd in db.QuestionnaireDetail.WHere(r=>r.QuestionId== q.QuestionId) 
      from qe in db.Questionnaire.Where(r=>r.QuestinnareId == qd.QuestinnareId) 
      orderby qg.Sequence 
      select new { Questionnaire = q, QuestionnaireDetail = qd }; 

編輯

您可能您正在使用實體框架喜歡這種語法

var query = from qg in db.QuestionGroup 
      join q in db.Questions on qg.QuestionGroupId equals q.QuestionGroupId 
      join qd in db.QuestionnaireDetail on q.QuestionId equals qg.QuestionId 
      join qe in db.Questionnaire on qd.QuestinnareId equals qe.QuestinnareId 
      orderby qg.Sequence 
      select new { Questionnaire = q, QuestionnaireDetail = qd }; 
+0

謝謝,我會試試看,但這裏有很多'從',我從來沒有見過它。這是唯一的方法,還是我們可以使用'Include'而不是使用許多'from'?使用'from'的 – Willy 2014-12-19 03:51:01

+0

與SQL中的'INNER JOIN'類似。看看我的編輯 – opewix 2014-12-19 03:51:53

+0

我有錯誤'缺少類型映射配置或不支持的映射'。我使用AutoMapper,從數據庫獲得調查問卷後,我將其映射到viewmodel'QuestionnaireViewModel questionnaireVM = Mapper。Map (問卷);' – Willy 2014-12-19 04:09:44