2

是否可以在实体框架中使用扩展方法进行投影:

public class ProjectRepository
{
    public IQueryable<ProjectDto> GetActiveProjects()
    {
        // db.Projects is a DbSet<Project>
        // i want to use a projection to convert it to ProjectDto,
        // I know I can do new ProjectDto but I would rather do an
        // extension method and abstract that logic out
        return from p in db.Projects
            where p.Status == "Active"
            select p.AsProjectDto();
    }
}

现在我收到以下错误:

LINQ to Entities 无法识别方法“AsProjectDto”方法,并且此方法无法转换为存储表达式。

LINQ to SQL 似乎能够处理这个问题,但实体框架却不能。是否有某种方式我需要编写扩展方法以便它在 EF 中工作?

这是我的扩展方法:

public static class ProjectExtensions
{
    public static ProjectDto AsProjectDto(this Project project)
    {
        return new ProjectDto
        {
            Id = project.Id,
            Name = project.ProjectName
        };
    }
}
4

1 回答 1

5

要对数据调用 C# 方法以对其进行投影,您需要将该部分转换为 Linq to Objects 查询;

return (from p in db.Projects
        where p.Status == "Active"
        select p)
    .AsEnumerable().Select(x => x.AsProjectDto());

这将从数据库中进行数据选择,并将数据作为 Enumerable 返回,您可以在该 Enumerable 上进行投影。

编辑:现在不能用 EF 测试它,但是既然你问了,你应该也可以在数据库中使用表达式来做它;

private static readonly Expression<Func<Project, ProjectDto>> AsProjectDto = 
    x => new ProjectDto {Id = x.Id, Name = x.ProjectName};

return db.Projects.Where(p => p.Status == "Active").Select(AsProjectDto);
于 2013-02-18T21:49:20.753 回答