【问题标题】:Entity Framework select from user specified table实体框架从用户指定的表中选择
【发布时间】:2017-04-26 19:55:28
【问题描述】:

我已经在这个话题上环顾了一段时间,但我找不到我真正理解的答案(或者有人问的问题足够接近)。

问题描述: 我有一个包含多个表的数据库,比如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) 之类的东西?

【问题讨论】:

    标签: c# mysql sql entity-framework


    【解决方案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);
    

    【讨论】:

    • 那还不需要我在代码中指定表格吗?我的意思是,从某种意义上说,我必须根据从 UI 中获取的字符串的内容来比较字符串并使用正确的 DBSet 调用函数?它确实显着减少了重复代码的数量
    • 实际上,我只是尝试实现它,它在减少代码方面做得很好!非常感谢!
    【解决方案2】:

    首先一个简单的改进是使用 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的文章对内容做了很好的解释。

    【讨论】:

    • 谢谢!今晚我会看看这篇博文,看看它对我有什么帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多