【问题标题】:LINQ: Why am I getting error on this LINQ Query?LINQ:为什么我在这个 LINQ 查询上遇到错误?
【发布时间】:2012-02-21 19:03:31
【问题描述】:

这是我存储库中的方法:

    public List<Question> getallquestion()
    {
        var hej = from Core in db.CoreValue
                    join Question in db.Question on Core.CID equals question.QID
                    join Subject in db.SubjectType on Core.CID equals Subject.SID
                    select new
                    {
                        Core.Cname,
                        Question.QuestionText,
                        Subject.Sname
                    };

        return hej.ToList();

    }

这是错误:

Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'NKI3.Models.Question'

这个错误的解决方法是什么?好像没找到

我的 CreateViewModel:

    public class CreateViewModel
    {
        public string QuestionText { get; set; }
        public string Sname { get; set; }
        public string Cname {get;set;}

    }
}

提前致谢!

最好的问候!

【问题讨论】:

  • 请显示Question类的可用公共构造函数

标签: asp.net-mvc asp.net-mvc-3 linq linq-to-sql repository


【解决方案1】:

您的 linq 查询生成匿名对象列表(当您使用 select new { (...) } 时没有任何类型)。您应该将其替换为select new Question() { (...) }。您应该根据 Question 类属性检查选择语法。

例如。当您拥有NameTextSubject 属性时,应如下所示:

    var hej = from c in db.CoreValue
                join q in db.Question on c.CID equals q.QID
                join s in db.SubjectType on c.CID equals s.SID
                select new Question
                {
                    QID = q.QID,
                    QuestionText  = q.QuestionText
                };

【讨论】:

  • 当我将其更改为您所说的内容时,现在又出现另一个错误:无法使用集合初始化程序初始化类型“NKI3.Models.Question”,因为它没有实现“System.Collections.IEnumerable”跨度>
  • 您应该将 Core.CnameQuestion.QuestionTextSubject.Sname 值分配给 Question 类属性。
  • 您能告诉我 Question 类包含哪些属性吗?
  • 我更新了答案。如果 Question 类仅包含这 2 个属性,则您不能在其中包含 SubjectType 值,就像您在问题上尝试的那样。
【解决方案2】:

将您的选择更改为如下所示:

public List<CreateViewModel> GetAllQuestionViewModel()
    {
        var hej = from Core in db.CoreValue
                    join Question in db.Question on Core.CID equals question.QID
                    join Subject in db.SubjectType on Core.CID equals Subject.SID
                    select new CreateViewModel
                    {
                        Cname = Core.Cname,
                        QuestionText = Question.QuestionText,
                        Sname = Subject.Sname
                    };

        return hej.ToList();

    }

在你的控制器中你会做这样的事情:

public ActionResult Index() {
    IEnumerable<CreateViewModel> questions = someContext.GetAllQuestionViewModel();
    return View(questions);
}

【讨论】:

  • 我猜它是Question 实体的Namespace。如果您的班级中已经有 using 语句,则可以使用 new Question
  • 我的问题只有 2 个属性及其 QID 和 QuestionText。 Sname 来自于 SubjectType 表,Cname 来自于 CoreValue 表
  • 如果您能提供CreateViewIndex 的代码,我可以更好地回答您的问题。
【解决方案3】:

您的方法期望返回Question 类型的集合,但您的LINQ 查询返回anonymous type 的序列。您应该更改您的查询,例如更改您的投影:

public List<Question> getallquestion()
{
    var hej = from Core in db.CoreValue
                join Question in db.Question on Core.CID equals question.QID
                join Subject in db.SubjectType on Core.CID equals Subject.SID
                select new Question
                {
                    Name = Core.Cname,
                    Text = Question.QuestionText,
                    Subject = Subject.Sname
                };

    return hej.ToList();
}

这是使用object initializer 从查询结果中分配Question 类型的属性值。您的属性名称会有所不同。

【讨论】:

    【解决方案4】:

    你不能返回匿名类型。


    创建一个类

    public class QuestionResult
    {
     public string Core {get; set;}
     public string Question {get; set;}
     public string Subject{get; set;}
    }   
    

    并使用它

    public List<QuestionResult> getallquestion()
        {
            var hej = from Core in db.CoreValue
                        join Question in db.Question on Core.CID equals question.QID
                        join Subject in db.SubjectType on Core.CID equals Subject.SID
                        select new QuestionResult
                        {
                            Core = Core.Cname,
                            Question = Question.QuestionText,
                            Subject = Subject.Sname
                        };
    
            return hej.ToList();
    
        }                                            
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多