我收到异常,LINQ to Entities无法识别该方法。我理解这是因为我在Select语句中使用了toList()。
var study= db.StudySessions.Where(s => s.StudySessionId == sessionId).Select(session => new StudySessionDTO
{
Name = session.Name,
TypeCode = session.TypeCode,
Tutors = session.Tutors.Select(t => new TutorDTO
{
FirstName = t.FirstName,
LastName = t.LastName
}).ToList()
}).FirstOrDefault();
我理解这是因为我在Select语句中使用了toList()。但是,如果我删除它,我将收到语法错误。我必须使用投影否则当我尝试返回它时,我将遇到json引用循环问题。知道如何解决这个问题。
答案 0 :(得分:1)
由于您正在检索单个项目,因此可以通过调用AsEnumerable
强制读入内存,然后执行投影,如下所示:
var study= db.StudySessions
.Where(s => s.StudySessionId == sessionId)
.AsEnumerable() // The rest of the query happens in memory
.Select(session => new StudySessionDTO {
Name = session.Name
, TypeCode = session.TypeCode
, Tutors = session.Tutors.Select(
t => new TutorDTO {
FirstName = t.FirstName
, LastName = t.LastName
}).ToList()
}).FirstOrDefault();
由于sessionId
的过滤发生在数据库中,因此不会强制所有数据进入内存。
答案 1 :(得分:0)
投射到匿名对象,然后项目到您的DTO:
// Simplified to keep some important parts...
var study= db.StudySessions
.Select(session => new // Anonymous Type
{
Tutors = session.Tutors
.Select(t => new TutorDTO
{
FirstName = t.FirstName
})
})
.ToList() // Now it's in memory.
.Select(session => new StudySessionDTO
{
Tutors = session.Tutors.ToList()
});