首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ-to-Entities中的动态投影

LINQ-to-Entities中的动态投影
EN

Stack Overflow用户
提问于 2011-10-26 08:44:49
回答 3查看 649关注 0票数 1

可以动态地定义进入Select()投影的代码吗?我有一个WCF服务,它公开数据对象,如下所示:

代码语言:javascript
复制
class Exam {
    string CourseName;
    DateTime Date;
    Attendee[] Attendees;
}

class Attendee {
    string Name;
    …
}

在类似如下的方法中:

代码语言:javascript
复制
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- to -Entities中指定多个步骤的投影?

EN

回答 3

Stack Overflow用户

发布于 2011-10-26 11:15:42

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-10-26 11:25:15

这只是一个想法(代码不好),但我认为这可能是您正在寻找的:

代码语言:javascript
复制
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 ...)
    };
}
票数 0
EN

Stack Overflow用户

发布于 2011-10-26 19:29:50

您提供的代码看起来有一些缺陷,因为您从应该返回examdetail的方法返回exam,除非存在某种继承关系,但它似乎是落后的,因为它很可能是exam method而不是exam是exam method。不管怎样,这样的东西可能会有一些有用的东西:

代码语言:javascript
复制
ExamDetail GetExamWithAttendees(long examId) {
return GetExams.Select(e => {var exam = e; exam.Attendees = e.Attendees.Select(a => …); return exam;});

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7897537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档