1

私はこのLINQを持っています

 var questions = _context.Questions
            .Where(q => q.Level.Level == level)
            .Select(q => new QuestionViewModel
            {
                Text = q.Text,
                Id = q.Id,
                IsMultiSelected = q.IsMultiSelected,
                AnswerViewModels = q.Answers
                                       .Select(
                                           a => new AnswerViewModel
                                                    {
                                                        Checked = false,
                                                        Text = a.Text,
                                                        Id = a.Id
                                                    }) as List<AnswerViewModel>
            });
        return questions.ToList();

私は得る

Exception Details: System.NotSupportedException: The 'TypeAs' expression with an input of type 'System.Collections.Generic.IEnumerable`1' and a check of type 'System.Collections.Generic.List`1' is not supported. Only entity types and complex types are supported in LINQ to Entities queries.

return questions.ToList();

select では匿名型を使用しません。このエラーを解決するには?

アップデート

私はいくつかの解決策をコーディングしました

    List<QuestionViewModel> result = new List<QuestionViewModel>();
    var questions = from q in _context.Questions
                    where q.Level.Level == level
                    select new QuestionViewModel()
                               {
                                   Text = q.Text,
                                   Id = q.Id,
                                   IsMultiSelected = q.IsMultiSelected,
                                   AnswerViewModels = from a in q.Answers
                                                      select new AnswerViewModel
                                                                 {
                                                                     Text = a.Text,
                                                                     Id = a.Id,
                                                                     Checked = false
                                                                 }
                               };
    var qList = questions.ToList();
    for(int i = 0; i < questions.Count(); i++)
    {
        var q = qList[i]; //question
        var a = q.AnswerViewModels.ToList(); //answers for question
        var answers = new List<AnswerViewModel>(); //List answers
        for(int j = 0; j < a.Count(); j++)
        {
            //add new Answer from IEnumerable<AnswerViewQuestion> to List<...>
            answers.Add(new AnswerViewModel
                            {
                                Checked = false,
                                Id = a[j].Id,
                                Text = a[j].Text
                            });
        }
        result.Add(q);
    }

最適化する方法は?

4

2 に答える 2

4

問題は

.Select(a => new AnswerViewModel { ... }) as List<AnswerViewModel>

そのはず

.Select(a => new AnswerViewModel { ... }).ToList()

その理由は、LINQ で生成さIEnumerableれたを に変換する正しい方法は、もちろん、指定された最後の行で既に実行している拡張メソッドをList呼び出すことによるためです。ToList

于 2012-04-30T09:35:35.973 に答える
1

次のようなことを試してください:

var questions = _context.Questions
            .Where(q => q.Level.Level == level)
            .Select(q => new QuestionViewModel
            {
                Text = q.Text,
                Id = q.Id,
                IsMultiSelected = q.IsMultiSelected,
                AnswerViewModels = q.Answers
                                       .Select(
                                           a => new AnswerViewModel
                                                    {
                                                        Checked = false,
                                                        Text = a.Text,
                                                        Id = a.Id
                                                    })
            }).AsEnumerable().Select(x => new QuestionViewModel
              {
                   Text = x.Text,
                   Id = x.Id,
                   IsMultiSelected = x.IsMultiSelected,
                   AnswerViewModels = x.Answers.ToList()
               });
        return questions.ToList();
于 2012-04-30T09:40:13.853 に答える