可以动态地定义进入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- to -Entities中指定多个步骤的投影?
发布于 2011-10-26 11:15:42
关于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;
}发布于 2011-10-26 11:25:15
这只是一个想法(代码不好),但我认为这可能是您正在寻找的:
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 ...)
};
}发布于 2011-10-26 19:29:50
您提供的代码看起来有一些缺陷,因为您从应该返回examdetail的方法返回exam,除非存在某种继承关系,但它似乎是落后的,因为它很可能是exam method而不是exam是exam method。不管怎样,这样的东西可能会有一些有用的东西:
ExamDetail GetExamWithAttendees(long examId) {
return GetExams.Select(e => {var exam = e; exam.Attendees = e.Attendees.Select(a => …); return exam;});}
https://stackoverflow.com/questions/7897537
复制相似问题