我有一个名为 Product 的抽象类型,以及五个从 Product 继承的“类型”,每个类型层次结构如下所示:
我想获取所有产品的所有信息,包括从产品继承的不同对象的一些属性,以将它们转换到新类中以在 MVC 网页中使用。我的 linq 查询如下:
//Return the required products
var model = from p in Product.Products
where p.archive == false && ((Prod_ID == 0) || (p.ID == Prod_ID))
select new SearchViewModel
{
ID = p.ID,
lend_name = p.Lender.lend_name,
pDes_rate = p.pDes_rate,
pDes_details = p.pDes_details,
pDes_totTerm = p.pDes_totTerm,
pDes_APR = p.pDes_APR,
pDes_revDesc = p.pDes_revDesc,
pMax_desc = p.pMax_desc,
dDipNeeded = p.dDipNeeded,
dAppNeeded = p.dAppNeeded,
CalcFields = new DAL.SearchCalcFields
{
pDes_type = p.pDes_type,
pDes_rate = p.pDes_rate,
pTFi_fixedRate = p.pTFi_fixedRate
}
}
我遇到的问题是访问 p.pTFi_fixedRate,这不会随实体的 Products 集合一起返回,因为它在 Fixed 的父类(super class)型中。如何使用 Linq 和 Entity Framework 返回“ super ”类型的 Products (Fixed) 属性。实际上,我需要从所有不同的父类(super class)型(Disc、Track 等)返回一些字段以用于计算。我是否应该将这些作为单独的 Linq 查询返回,以检查返回的“产品”类型?
最佳答案
这是一个很好的问题。我看过朱莉·勒曼 (Julie Lerman) 的书并在互联网上进行了搜索,但我找不到优雅的答案。
如果是我,我会创建一个数据传输对象,其中包含类型的所有属性,然后对每种类型进行单独的查询,然后将它们联合起来。我会在属性与该类型不相关的 DTO 属性中插入空白。然后我希望 EF 引擎在创建体面的 SQL 方面做出合理的尝试。
例子
var results = (from p in context.Products.OfType<Disc>
select new ProductDTO {basefield1 = p.val1, discField=p.val2, fixedField=""})
.Union(
from p in context.Products.OfType<Fixed>
select new ProductDTO {basefield1 = p.val1, discField="", fixedField=p.val2});
但这不是最好的答案。还有其他的吗?
关于linq - Entity Framework 、每种类型的表和 Linq - 获取 "Type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8975093/