实体框架中的自动投影

时间:2012-02-23 11:09:57

标签: entity-framework c#-4.0 reflection extension-methods projection

无论如何在实体框架中创建自动投影?请看:

public class Person{ 
    public int Id {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public string FatherName {get; set;} 
    public string City {get; set;} 
    public string AddressLine {get; set;} 
    public string Something {get; set;} 
}

public class PersonNameModel{
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public string FatherName {get; set;} 
}

public class PersonAddressModel{
    public string City {get; set;} 
    public string AddressLine {get; set;} 
}

// etc...

我的意思是我可以替换正常投影,如:

context.Persons.Select(t => new PersonNameModel{ FirstName = t.FirstName /* etc */ });

使用反射并创建自动投影的扩展方法,如:

public static class MyExtensions{
    public static IQueryable<T> AutoSelect<T, TProject>(this IQueryable<T> q){
        // read TProject type in reflection
        // create a projection as a IQueryable<T> 
    }
}

有什么办法吗?我用谷歌搜索,但没有找到任何资源。你能指导我吗?

2 个答案:

答案 0 :(得分:1)

是的,可以将实体框架实体自动投影到某些Dto。请参阅此处的一个实施https://gist.github.com/1367880

您可以将其用作:

context.Persons.Project().To<PersonNameModel>().ToList();

在这种情况下,将生成db查询以仅选择必需的列(由PersonNameModel指定)。

如果您只想映射查询结果(检索到的对象),那么EmitMapper或AutoMapper应该是您的选择。

答案 1 :(得分:0)

如果我理解你想要的是对象之间的映射,使用Automapper它会为你做映射

http://www.codeproject.com/Articles/61629/AutoMapper

http://automapper.org/

git hub path https://github.com/AutoMapper/AutoMapper