我已经在这个主题上看了一会儿,但我找不到我真正理解的答案(或者有人问过一些足够接近的话)。
问题描述:
我有一个包含多个表的数据库,比如apples
,oranges
和bananas
。每个下面都有一堆信息。其中一个属性很常见,比方说expirationDate
。
我需要用户能够查询其中一个的到期日期(例如apple
与id=1
)
用户可以在GUI中选择所有这些内容(包含表名和id
文本框的组合框)
到目前为止我有什么: 在后台代码/业务逻辑中,我有以下
.
.
.
if(tableName.Equals("apples"))
{
DateTime expDate = getAppleDetails(id)
}
if(tableName.Equals("oranges"))
{
//call function to select the single orangeEntry and do the rest
}
}
DateTime getAppleDetails(long id)
{
using(var db = new myContext())
{
var appleEntry = db.apples.Single(x=>x.id==id);
return appleEntry.ExpDate
}
}
我在寻找:
上面的代码向您展示了如何使用更大的数据库,我将不得不复制大量的代码。在同一个查询中执行此操作的更好方法是什么?
像db.TableNameHere.Single(x=> x.id == id)
?
答案 0 :(得分:1)
首先,一个简单的改进是使用db.apples.Find(id)代替og db.Single(x => x.id == id)。当你拥有id时,查找会更快。
您可以使用通用存储库来调用数据库。 本文http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle对内容进行了精细解释。
答案 1 :(得分:1)
您可以拥有一个名为IExpirationDate
的接口,其界面如下所示
public interface IExpirationDate
{
DateTime ExpirationDate { get; set; }
}
ExpirationDate
的班级必须实施IExpirationDate
,例如
public class Orange : IExpirationDate
{
//Other properties of the class
public DateTime ExpirationDate { get; set; } //Property from interface
}
当实现IExpirationDate
接口的所有必需类时,您可以使用一个通用方法来获取其中任何一个的到期日期,这将是这样的
public static DateTime GetExpirationDate<T>(long id)
where T : class, IExpirationDate
{
using(var db = new myContext())
{
var entry = db.Set<T>.Find(id);
return entry.ExpirationDate;
}
}
现在,要获取Orange
课程的到期日期,您只需拨打
var expirationDate = GetExpirationDate<Orange>(id);