我有一个简单的数据库应用程序,并且正在使用WCF和Entity Framework进行数据库交互。
在我的服务中,我有一个名为DatabaseTable的父类,所有其他类都继承自此类,并覆盖下面列出的方法(这些也在我的服务合同中,并暴露给我的客户端应用程序)
选择 更新 插入 去掉 得到所有 GetSetByKey
这些服务中的每一个都接受DatabaseTable对象作为参数,并完成所需的操作。
问题是,我的一个类Part,有多种GetSetByKey方法(根据DataBaseObject参数中发送的条件填充列表)。其他类都从主键中获取,但是这一个,我需要按不同的标准获取GetSets(或列表),如Vendor,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>();
}
当我只有另外一个条件时,这种方法很有效,但是你可以看到它已经失控了。我知道我可以使用Reflection,传递字段的名称,并使用它来进行查询,但我被告知反射是非常昂贵的处理器明智。
我正在努力保持我的服务干净,因此它只有基本的SQL命令,而不是像GetPartsByVedndor()
或GetPartsByPurchaseOrder()
那样添加特定的合同。我没有合理的理由,只是它使服务实现非常干净。
关于如何更好地做这件事是否有任何其他建议,因为除了Reflection或向服务添加新方法之外我无所适从。如果在这里使用Reflection似乎没问题,请解释什么时候不行。