【问题标题】:How to correctly convert from IEnumerable<T> to List<T>?如何正确地将 IEnumerable<T> 转换为 List<T>?
【发布时间】:2012-04-30 09:32:35
【问题描述】:

我有这个 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();

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

更新

我编写了一些解决方案

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

如何优化?

【问题讨论】:

    标签: c# linq list ienumerable


    【解决方案1】:

    问题出在

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

    应该是

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

    原因在于,将 LINQ 生成的 IEnumerable 转换为 List 的正确方法当然是调用 ToList 扩展方法,您已经在给出的​​最后一行中这样做了。

    【讨论】:

    • 澄清一下,如果你使用 Jon 的提议,你需要返回 just questions:return question;
    • 不工作。 'LINQ to Entities 无法识别方法 'System.Collections.Generic.List1[ExpertApplication.ViewModels.AnswerViewModel] ToList[AnswerViewModel](System.Collections.Generic.IEnumerable1[ExpertApplication.ViewModels.AnswerViewModel])' 方法,并且此方法无法转换为存储表达式。 '
    • 我搜索了一些问题'stackoverflow.com/questions/3800834/…',但它的答案对我不起作用
    【解决方案2】:

    试试这样的:

    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-02-24
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2018-08-04
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多