C# 实体框架上下文能否返回继承实体的类

C# 实体框架上下文能否返回继承实体的类,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有一个实体框架5代码优先DbContext public class ProductContext : DbContext { public DbSet<Product> Products {get;set;} } public class Product { public int ProductId { get; set; } public string Name { get; set; } } 我知道我能做到: var query = from p

我有一个实体框架5代码优先DbContext

public class ProductContext : DbContext
{
    public DbSet<Product> Products {get;set;}
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
}
我知道我能做到:

var query = from p in context.Products
            select new ProductEx { p.ProductId, p.Name };
但是,由于DbContext已经返回了一个动态代理(因为更改跟踪/延迟加载),可能有更好的方法。我在想这样的事情:

var query = from p in context.Products.As<ProductEx>()
            select p;
var query=来自context.Products.As()中的p
选择p;
这些实体应该是从ProductEx继承的动态代理


有没有办法做到这一点?

一种方法是您可以为产品创建包装:

public class Product
{
    public virtual int ProductId { get; set; }
    public virtual string Name { get; set; }
}

public class ProductEx : Product, ISomeInterface
{
    private readonly Product _product;

    public ProductEx(Product product) {
        this._product = product;
    }

    public bool ISomeInterface.SomeMethod() { return false; }

    public override int ProductId
    { 
        get { return this._product.ProductId; }
        set { this._product.ProductId = value; }
    }

    public override string Name
    { 
        get { return this._product.Name; }
        set { this._product.Name = value; }
    }
}
然后您可以查询liko so:

var query = from p in context.Products
        select new ProductEx(p);

这将是一个有效的解决方案。但这将意味着大量的工作,因为在大局中,我将有更多的模型和更多的属性。你想过使用分部类吗?一个文件中可以有属性,另一个文件中可以有方法。是的,接口将由
产品
实现,但至少您将具有光学分离。
var query = from p in context.Products
        select new ProductEx(p);