实体框架从用户指定的表中选择

时间:2017-04-26 19:55:29

标签: c# mysql sql entity-framework

我已经在这个主题上看了一会儿,但我找不到我真正理解的答案(或者有人问过一些足够接近的话)。

问题描述: 我有一个包含多个表的数据库,比如applesorangesbananas。每个下面都有一堆信息。其中一个属性很常见,比方说expirationDate

我需要用户能够查询其中一个的到期日期(例如appleid=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)

这样的东西

2 个答案:

答案 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);