>我有一个类定义为:
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
。这将返回一个包含 PayPal
和 PaymentCard
的列表。我还想分别包括BankAccount
和FxRate
。
如果我将这些值作为逗号分隔的值添加到查询的Include()
方法中,则会出错,声称"支付卡没有名为'FxRate'的属性。
我尝试做:
_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>'
我可以在一个查询中执行此操作,还是需要为每种类型调用数据库?
谢谢
这个答案实现了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();
编辑:实现此目的的另一种方法是使用每个层次结构的表。在这种情况下,上下文类仅包含以下 DbSet:
public DbSet<ElectronicFundTransfer> ElectronicFundTransfers { get; set; }
查询只需要调用一次数据库:
ElectronicFundTransfer[] all = context.ElectronicFundTransfers.Where(ef => ef.OrganisationId == orgId).ToArray();