我有一个简单的数据库应用程序,并且正在使用 WCF 和实体框架进行数据库交互。
在我的服务中,我有一个名为 DatabaseTable 的父类,所有其他类都继承自该类,并覆盖下面列出的方法(这些方法也在我的服务合同中并暴露给我的客户端应用程序)
选择更新插入删除GetAll GetSetByKey
这些服务中的每一个都接受一个 DatabaseTable 对象作为参数,并执行所需的操作。
问题是,我的一个类 Part 有多种 GetSetByKey 方法(根据 DataBaseObject 参数中发送的标准填充列表)。其他类都从主键中获取,但是这一类,我需要按不同的标准获取集合(或列表),如供应商、PurchaseOrderNumber、Claim、InvoiceNumber、ShipToUser 等...
我开始做的是使用下面的 if 语句
if (this.Claim == 0) // Get By PO
{
if (string.IsNullOrEmpty(this.InvoiceNumber) && this.VendorCode == 0)
{
parts = (from part in context.Parts where part.PurchaseOrder == this.PurchaseOrder select part).ToList<Parts>();
}
else if (this.VendorCode == 0)
{
parts = (from part in context.Parts where part.InvoiceNumber == this.InvoiceNumber select part).ToList<Parts>();
}
else
{
parts = (from part in context.Parts where part.VendorCode == this.VendorCode select part).ToList<Parts>();
}
}
else
{
parts = (from part in context.Parts where part.Claim == this.Claim select part).ToList<Parts>();
}
当我只有另一种情况时,这很有效,但正如你所见,它已经失控了。我知道我可以使用反射,传递字段的名称,并使用它来进行查询,但有人告诉我反射在处理器方面确实很昂贵。
我试图保持我的服务干净,所以它只有基本的 SQL 命令,而不是添加特定的合同,如GetPartsByVedndor()
or GetPartsByPurchaseOrder()
。我没有合乎逻辑的理由,只是它使服务实现非常干净。
关于如何更好地做到这一点还有其他建议吗,因为除了反射或向服务添加新方法外,我不知所措。如果在这里使用反射似乎可以,请解释一下什么时候不可以。