如何只选择一列来返回linq中的对象

时间:2016-07-01 17:04:21

标签: c# entity-framework linq

我试图只选择CourseId属性,但它给了我一个错误

  Course co = db.Courses.Include("Students").Where(c => c.CourseName == "C#")
            .Select(cc => new Course() { CourseId = cc.CourseId }).SingleOrDefault();

错误:

EntityFramework.SqlServer.dll中发生了'System.NotSupportedException'类型的异常,但未在用户代码中处理

附加信息:无法在LINQ to Entities查询中构造实体或复杂类型“Database1Model.Course”。

3 个答案:

答案 0 :(得分:2)

实体框架不允许您在LINQ-to-SQL查询中构造实体类型。

您可以在SQL端选择cc.CourseId,然后在执行SQL查询之后构造Course实体,如下所示:

var id = db.Courses
             .Include("Students")
             .Where(c => c.CourseName == "C#")
             .Select(cc => cc.CourseId)
             .SingleOrDefault();

var course = new Course() { CourseId = id  };

顺便说一下,你为什么要包括"学生"如果你只需要课程ID?

答案 1 :(得分:2)

这个怎么样?

var courseAndStudents = db.Courses
    .Where(c => c.CourseName == "C#")
    .Select(cc => new { cc.CourseId, cc.Students })
    .SingleOrDefault();

您只会获得CourseId和所有Students

或者如果您真的不需要Students,那么只需选择CourseId

即可
var courseId = db.Courses
    .Where(c => c.CourseName == "C#")
    .Select(cc => cc.CourseId)
    .SingleOrDefault();

答案 2 :(得分:1)

  

我只想和他们的学生一起获得类型课程的对象   只有一次数据库之旅

如果是这样,那么修改Yacoub的回答:

更新:

var sourceWithStudents = db.Courses
                           .Include("Students")
                           .Where(c => c.CourseName == "C#")
                           .Select(c => new Course() { CourseName = c.CourseName, Students = c.Students} )
                           .SingleOrDefault();

sourceWithStudents将包含一个填充了Course的{​​{1}}个对象。

这应该得到你所追求的。我会质疑你的模型。如果你真的只需要名字和学生,你应该选择一个只包含这两个东西的课程。