2017-04-26 57 views
0

我已經在這個話題上四處瀏覽了一段時間,但是我找不到一個我實際上理解的答案(或者有人問了一些足夠接近的答案)。實體框架從用戶指定的表格中選擇

問題描述: 我有多個表的數據庫,說​​,orangesbananas。每個人都有一堆信息。其中一個屬性很常見,比如說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)

回答

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); 
+0

這不會要求我在代碼中指定表嗎?我的意思是,在某種意義上,我將不得不通過比較字符串並根據從UI中提取的字符串所說的正確DBSet調用函數? 它確實可以顯着減少重複代碼的數量 – robotHamster

+0

其實,我只是試着實現它,它爲我減少了代碼做得很好!非常感謝! – robotHamster