从EF查询中选择新的派生类

时间:2013-08-20 18:32:06

标签: c# entity-framework

在c#Entity Framework 4或5中

实体类#1

public class ClassOne
{
   public string FirstName { get;set; }
}

public class ClassTwo : ClassOne
{
    public string LastName get;set; }
}

表示IQueryable:

return from e in Context.pClassOneList from r in SomeOtherList select new ClassTwo
{

    // right here how do I get all the fields assigned without having to do it manually? ie:
    FirstName = e.FirstName,



    LastName = r.SomeOtherVar // works perfectly, but the whole of ClassOne is not assigned unless I do it manually.
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

简而言之,在表达式中自动绑定基类属性的唯一方法是动态生成select表达式。这将是相当多的工作,并会减慢您的代码。我不认为这是要走的路。但是,也许不是扩展基类就可以简单地封装它 - 你可以将结果嵌入到另一个对象中,如下所示:

public class ResultType 
{
    public ClassOne ClassOne { get; set; }
    public string SomeOtherVar { get; set; }
}

return  
    from e in Context.pClassOneList 
    from r in SomeOtherList 
    select new ResultType
    {
        ClassOne = e,
        SomeOtherVar = r.SomeOtherVar
    };

答案 1 :(得分:0)

好的,所以你基本上抓住了两个不同的列表然后使用对象初始化器实例化一个新对象,所以当然你必须手动完成它。

你可以在ClassTwo中创建一个构造函数,它接受ClassOne并保持ClassTwo的继承属性,甚至用适配器模式处理它。

SomeOtherList可能必须“手动”处理,具体取决于它包含的内容。但是,当您开始使用构造函数时,请注意您的SOLID原则。