2016-03-18 54 views
0

我會直接用代碼,然後解釋我的問題,這樣會更容易。爲了給擡起頭,我使用實體框架7與SQL Server 2014 ASP.NET 5和6 MVCSQL Server查詢創建不同的返回類型

所以,我下面的類:

public class Base { 
    public int BaseId { get; set; } 
    public string Name { get; set; } 
} 
public class DerivedOne : Base { 
    public virtual List<OtherDBObject> ListOne { get; set; } 
} 
public class DerivedTwo : Base { 
    public string SomeContent { get; set; } 
} 

我創建存儲庫retrievs數據庫中的基礎對象。問題是,DerivedOne和DerivedTwo擁有不同的成員 - 我如何知道要返回哪種類型(哪些成員要進一步查詢)?

public class Repo : IRepo { 
    public async Task<Base> GetById(int id) { 
     // I though that this method should work something like this (its pseudo code) : 
     context.Base.Where(b => b.BaseId == id) 
      .switch(obj.type) { 
       case DerivedOne : query for OtherDBObjects 
       case DerivedTwo : query for string content somewhere else 
       ... 
      }).First(); 
    } 
} 

我的目標是擁有僅包含幾個基本的領域和派生的人可以完全不同勢非常抽象基類。

PS如果您對此任務有不同的結構,請隨時發佈!

+0

我不能完全確定你想做什麼在這裏,但不能只是查詢Base對象,然後查看獲取的對象是DerivedOne類型還是DerivedTwo類型? –

+0

嗯,是的,但它會被分成兩個查詢數據庫 - 一個獲取基地,然後檢查它的類型,然後查詢派生類的內容。我認爲將一個查詢比兩個查詢更好 - 開銷要小得多。 –

+0

基於對象類型檢查的控制流程=非常糟糕的設計。 –

回答

0

您可以通過使用泛型和擴展方法,像下面這樣寫的好東西:

public static Task<TEntity> GetByIdAsync<TEntity>( 
    this DbSet<TEntity> set, int id) where TEntity : Base 
{ 
    return set.FirstOrDefaultAsync(e => e.Id == id); 
} 

使用範例:

DerivedOne entity = await DbContext.DerivedOnes.GetByIdAsync(id); 
+0

如果我在查詢數據庫之前知道實體的類型,那麼我會這樣做。我只想調用api,比如'api/lesson/id',結果將會與所有相應的成員一起輸入。 我的數據庫幾乎總是隻讀的 - 你怎麼看待在一些鍵值中存儲靜態的預先創建的內容(我使用的是Azure,所以選擇的將是TableStorage),其中key只是id? –

+0

該方法不知道你要查詢什麼類型。在您的課程中,控制器/索引操作是您使用「樣本用法」語法指定具體類型的位置。 –

+0

我不知道我是否清楚:我只將ID傳遞給數據庫,我不知道我查詢的是什麼類型,直到查詢返回數據。所以我需要把它作爲基本類型。換句話說:函數應該只有'return ..'裏面。例如: public Base GetById(int id){ return DbContext.Base.GetById(id); } 如果數據結果是DerivedType,它應該包含它的成員。 –