Dis*_*ile 2 c# linq-to-entities entity-framework
是否可以在实体框架中使用扩展方法进行投影:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我收到以下错误:
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
};
}
}
Run Code Online (Sandbox Code Playgroud)
要对数据调用C#方法进行投影,您需要转换为该部分的Linq to Objects查询;
return (from p in db.Projects
where p.Status == "Active"
select p)
.AsEnumerable().Select(x => x.AsProjectDto());
Run Code Online (Sandbox Code Playgroud)
这将从数据库中进行数据选择,并将数据作为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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4073 次 |
| 最近记录: |