LINQ to Entities无法识别该方法

时间:2014-04-25 17:14:01

标签: sql linq entity-framework

我收到异常,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引用循环问题。知道如何解决这个问题。

2 个答案:

答案 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()
             });
相关问题