0

調査を作成して回答を処理するためのシステムを構築しています。ビューモデルは SurveyTakeViewModel です。

namespace Survey.ViewModel
{
     public class SurveyTakeViewModel
     {
         public Models.Survey Survey { get; set; }
         public bool TakenBefore { get; set; }
     }
 }

namespace Survey.Models
{
    public class Survey
    {
        [Key]
        public int SurveyId { get; set; }

        public string Name { get; set; }
        public bool Active { get; set; }

        public string MessageStart { get; set; }
        public string MessageEnd { get; set; }

        public virtual ICollection<Question> Question { get; set; }
    }
}

namespace Survey.Models
{
    public class Question
    {
         public virtual int SurveyId { get; set; }

         [Key]
         public int QuestionId { get; set; }
         public int DisplayOrder { get; set; }
         public string QuestionText { get; set; }
         public string QuestionNote { get; set; }
         public int QuestionTypeId { get; set; }

         public virtual QuestionType QuestionType { get; set; }

         public virtual ICollection<QuestionAnswerOption> QuestionAnswerOption{ get; set; }
         public virtual ICollection<QuestionAnswer> QuestionAnswer { get; set; }
     }
 }

 namespace Survey.Models
 {
     public class QuestionAnswer
     {
         public virtual int QuestionId { get; set; }

         [Key]
         public int QuestionAnswerId { get; set; }
         public int SurveyId { get; set; }
         public string UserId { get; set; }
         public string QuestionActualResponse { get; set; }
     }
 }

アンケートではすべて正常に機能しますが、ユーザーが以前に回答したアンケートに再度アクセスすると、ビューモデルの QuestionAnswer 部分に特定のユーザー ID のみによる回答を入力したいと思います。さまざまなLinqクエリを試しましたが、最初はICollections<>がList<>でしたが、すべてのレコードが返される可能性があると言われました。

現時点で私が使用している

Survey = db.Survey.FirstOrDefault(s => s.SurveyId == 1)

すべての QuestionAnswer を返します

私は次のようなことを試しました

Survey = db.Survey.FirstOrDefault(a => a.Question
.Any(b => b.QuestionAnswer
.Any(c => c.UserId == userId)));

ただし、すべての userId に対してすべての QuestionAnswer を返します

4

1 に答える 1

0

必要な調査はわかっているようですが、さまざまなプロパティにアクセスすると、追加の情報が入力されます...孫のレコードを減らしたいと思います。

必要な方法で読み込みを制限するのに十分な LinqToEntities を知りません (LinqToSql は and を使用DataLoadOptions.LoadsWithしますDataLoadOptions.AssociateWith)。代わりに、ロード後に手動でデータを整形します。おそらく、専門家が質問を理解するのに役立ち、LinqToEntities クエリでそれを表現できます。

int surveyId = GetSurveyId();
int userId = GetUserId();

Survey mySurvey = db.Survey.FirstOrDefault(s => s.SurveyId == surveyId);

ILookup<int, QuestionAnswer> qaLookup = db.QuestionAnswer
  .Where(qa => qa.SurveyId == surveyId && qa.UserId == userId)
  .ToLookup(qa => qa.QuestionId);

foreach(Question q in mySurvey.Questions)
{
  //limit q.QuestionAnswer to only this user's answers.
  q.QuestionAnswer = qaLookup[q.QuestionId].ToList();
}
于 2013-01-25T16:56:06.553 に答える