是否可以动态定义进入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。 (当然,我的实际模型有很多属性。)
我想要做的是重复使用对Exam
和ExamDetail
属性进行投影的代码 - 有相当多的代码,其中大部分用于多个方法,我想避免单独的数据库往返。有没有办法在LINQ到实体的多个步骤中指定投影?
答案 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;});
}