检索实体框架

时间:2016-06-02 10:04:35

标签: c# entity-framework

我有一个定义为:

的类
public class ElectronicFundTransfer
{
    public int Id { get; set;}
    public int OrganisationId { get; set; }
}

和两个继承的类:

 public class PayPal : ElectronicFundTransfer
{
    public BankAccount BankAccount { get; set; }
}

 public class PaymentCard : ElectronicFundTransfer
{
    public FxRate FxRate { get; set; }
}

请注意,这已经有所简化,还有其他继承的类和其他导航属性。

现在,对于一个组织,我想得到他们所有的ElectronicFundTransfers。这将返回包含PayPalPaymentCard的列表。我还想分别包含BankAccountFxRate

如果我将这些以逗号分隔值添加到查询的Include()方法,则会错误地声称&#34; PaymentCard没有名为“FxRate”的属性。< / p>

我尝试过:

_unitOfWork.ElectronicFundTransferRepository.Queryable() .Where(o => o.OrganisationId == organisationId) .Include<PayPal>("BankAccount");

但是我收到了错误

  

Instance argument: cannot convert from 'System.Linq.IQueryable<ElectronicFundTransfer>' to 'System.Linq.IQueryable<PayPal>'

我可以在一个查询中执行此操作,还是需要为每种类型调用数据库?

由于

1 个答案:

答案 0 :(得分:0)

这个答案实现了Gert Arnold的评论:

        Context context = new Context();
        int orgId = 1;
        ElectronicFundTransfer[] paymentcards = context.PaymentCards.Where(pc => pc.OrganisationId == orgId).ToArray();
        ElectronicFundTransfer[] paypals = context.PayPals.Where(pp => pp.OrganisationId == orgId).ToArray();
        ElectronicFundTransfer[] all = paymentcards.Union(paypals).ToArray();

编辑:实现此目标的另一种方法是使用Table-Per-Hierarchy。在这种情况下,上下文类仅包含以下DbSet:

public DbSet<ElectronicFundTransfer> ElectronicFundTransfers { get; set; }

查询只需要调用一次数据库:

ElectronicFundTransfer[] all = context.ElectronicFundTransfers.Where(ef => ef.OrganisationId == orgId).ToArray();