如何在linq中仅选择一列以返回对象

本文关键字:一列 对象 返回 linq 选择 | 更新日期: 2023-09-27 17:54:25

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

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

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

附加信息:实体或复杂类型'Database1Model '。Course'不能在LINQ to Entities查询中构造。

如何在linq中仅选择一列以返回对象

这个呢

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

实体框架不允许在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,为什么要包括"学生"?

我只是想得到一个OBJECT类型的课程与他们的学生与只访问一次数据库

如果是这种情况,那么修改雅各布的答案:

更新:

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

sourceWithStudents将包含一个用Students填充的Course对象。

这应该能得到你想要的。我怀疑你的模式。如果您确实只需要名称和学生,那么您应该选择一个只包含这两个内容的Course类。