1

LINQクエリからこれを取得しようとしています:

 Question 1 - Answer 1
            - Answer 2 (Selected)
            - Answer 3

 Question 2 - Answer 1
            - Answer 2
            - Answer 3 (Selected)
 etc..

私のテーブルは次のようになります。

Question (with attached multilang support which I'll leave out for now)
QuestionAnswer
Answer (also with multilang)
Response (where the user's response is kept (aka which answer he took -> a specif QuestionAnswer row)
Questionnaire (where all the questionanswers for a single questionnaire are kept)

次のことを試しましたが、.ToList()を実行すると(コンパイル時ではなくExcecution時に)ストアドプロシージャに変換できないという例外が発生します(これは変換されることに注意してください)。

(from culture in DbContext.Culture    
from questionanswer in DbContext.QuestionAnswer
join questionnaire in DbContext.Questionnaire on questionanswer .QuestionnaireID equals questionnaire.QuestionnaireID 

where culture.TwoLetterISO.Equals(cultureCode) &&
    questionnaire.QuestionnaireID == id

select new QuestionnaireSectionInformation()
{   
    // Additional data is retrieved here, but thats not important for this question
     Questions = 
        ((from question in DbContext.Question
           join qmultilang in DbContext.QuestionMultiLang on question.ID equals qMultiLang.Id
           join response in DbContext.Response on questionanswer.ID equals response.questionanswerId into possibleReponse

           where question.ID == questionanswer.QuestionID &&
               qMultiLang.CultureId == culture.ID
           select new Topic()
           {
               Question = qMultiLang.Vraag,
               Opmerking = possibleResponse.Any() ? possibleResponse.FirstOrDefault().Commentaar : null,
               Answers= 
                ((from answer in DbContext.Answer
                  join aMultiLang in DbContext.AnswerMultiLang on answer.ID equals aMultiLang.Id
                  where aMultiLang.CultureId == culture.ID
                  select new Answer()
                  {
                     Answer= aMultiLang.Answer,
                     Selected = possibleAnswer.Any()
                  }).ToList())
           }).ToList())
}).ToList();

私はもう少しLINQを学ぼうとしているので、これを分解していません(データを取得し、そこから質問と回答を抽出するだけです)。

したがって、問題は次のとおりです。実行すると、.ToList()をストアドプロシージャに変換できないという例外が発生します。質問のすべての子要素を.ToList()を呼び出せない場合、どうすれば取得できますか?

4

1 に答える 1

2

内部クエリでToListを呼び出さないでください。その部分をT-SQLに変換する必要がないため、クエリの最後でToListを呼び出すことができることに注意してください。

代わりにAsQueryable()を使用している可能性があり、最後のステップでToList()を使用しているだけです。

それで:

AsQueryableは、リストを取得するために必要な命令であるクエリを作成するだけです。データベースレベルまで送信される新しいWhere句を追加するなど、後でクエリにさらに変更を加えることができます。

AsListは、メモリ内のすべてのアイテムを含む実際のリストを返します。新しいWherecluseを追加すると、データベースが提供する高速フィルタリングが得られません。代わりに、リスト内のすべての情報を取得してから、アプリケーションで不要なものを除外します。これは、最終エンティティとしてすでに表示されているため、それ以上の変更は許可されません。

于 2012-11-15T13:07:36.477 に答える