2012-04-30 97 views
1

我有这样的LINQ如何正确从IEnumerable <T>转换为列表<T>?

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(); 

我不选择使用匿名类型。如何解决这个错误?

UPDATE

我编写了一些解决方案

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); 
    } 

如何优化?

回答

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(); 
4

问题是与

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

应该

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

的原因是,到LINQ生成IEnumerable转换为List正确的方式当然是通过调用ToList扩展方法,你已经在给出的​​最后一行中做了。

+0

只是为了澄清,如果使用Jon的建议,你需要回到刚才的问题: 回报问题; – 2012-04-30 09:41:46

+0

不要工作。 'LINQ to Entities does not recognized the method'System.Collections.Generic.List'1 [ExpertApplication.ViewModels.AnswerViewModel] ToList [AnswerViewModel](System.Collections.Generic.IEnumerable'1 [ExpertApplication.ViewModels.AnswerViewModel])'method ,并且此方法不能转换为商店表达式。 ' – BILL

+0

我搜索一些问题'http://stackoverflow.com/questions/3800834/nested-linq-returning-a-this-method-cannot-be-translated-into-a-store-expression'但它的答案不起作用为了我 – BILL

相关问题