LINQ-to-Entities中的动态预测

时间:2011-10-26 00:44:49

标签: c# wcf linq

是否可以动态定义进入Select()投影的代码?我有一个WCF服务,它公开类似于以下内容的数据对象:

class Exam {
    string CourseName;
    DateTime Date;
    Attendee[] Attendees;
}

class Attendee {
    string Name;
    …
}

的方法如下:

Exam[] GetExamList() {
    return _db.Exams.Select(e => new Exam {
        CourseName = e.Course.Name,
        Date = e.Date
        // Attendees stays set to null
    });
}

ExamDetail GetExamDetail(long examId) {
    return _db.Exams.Select(e => new ExamDetail {
        CourseName = e.Course.Name,
        Date = e.Date,
        Attendees = e.Attendees.Select(a => …)
    });
}

基本上,我正在将表层次结构扁平化为DTO。 (当然,我的实际模型有很多属性。)

我想要做的是重复使用对ExamExamDetail属性进行投影的代码 - 有相当多的代码,其中大部分用于多个方法,我想避免单独的数据库往返。有没有办法在LINQ到实体的多个步骤中指定投影?

3 个答案:

答案 0 :(得分:1)

关于LINQ的一个有趣的事情是它已经确定了执行,因此在你调用.ToList或枚举项目之前它不会实际执行查询。因此,您可以构建查询的第一部分并返回IQueryable。不确定这是否能回答你的问题,但它可能会有所帮助。

public void TestDB() {
        demoEntities de = new demoEntities();
        var q = firstPart(de, d => false);
        foreach(var item in q.Where(e => e.EmployeeID == 1)){

        }
    }

    public IQueryable<Employee> firstPart(demoEntities de, Func<Department, bool> departmentFilter) {
        return from e in de.Employees
               where departmentFilter(e.Department)
               select e;
    }

答案 1 :(得分:0)

这只是一个想法(代码并不好),但我认为这可能是你想要的:

IEnumerable<Exam> GetExams() {
    return _db.Exams.Select(e => CreateExamById(e);
}

IEnumerable<Exam> GetExamWithAttendees(long examId) {
    return _db.Exams.Select(e => CreateExamById(e, examId);
}

Exam CreateExamById(Exam exam, long examId=0){
    return new Exam {
        CourseName = exam.Course.Name,
        Date = exam.Date,
        Attendees = e.Attendees.Select(a => a..... == examId ...)
    };
}

答案 2 :(得分:0)

看起来你提供的代码有一些缺陷,你要从应该返回的方法返回考试,除非有一些继承关系,但它似乎落后了,因为它可能是一个考试尾部是一个考试而不是考试是考试。无论如何,这样的事情可能会有所帮助:

ExamDetail GetExamWithAttendees(long examId) {
return GetExams.Select(e => {var exam = e; exam.Attendees = e.Attendees.Select(a => …); return exam;});

}