2015-05-04 67 views
4

我有不同的實體,如汽車,人等屬性名稱取決於Id我想獲得的名稱。但我想在一個單一的方法得到它取得entityName並根據它輸出輸出。 事情是這樣的:使用實體框架動態選擇表

public string GetEntityByName(int id,string entityName) 
    { 
     using (var context = new MyContext()) 
     { 
      return context[entityName].Find(id).Name; 
     } 
    } 
+1

您是否有一些基本實體類與Name屬性定義? – haim770

+0

不,不存在具有名稱屬性的基本實體類,但它對於許多實體很常見 –

+0

您如何傳遞'entityName',它是簡單地作爲'class'(「Car」)的名稱,還是完整的'輸入名稱?另外,是否所有請求的實體都在同一個命名空間中? – haim770

回答

2

您所有的實體應該擴展基類或實現定義一個Name屬性的接口。

public interface INamed { 
    string Name { get; set; } 
} 

public class Car : INamed { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

我什麼DbContext支持索引屬性不知道,但如果這樣做,你可以設法做這樣的事情:如果你確保所有實體INamed

INamed namedEntity = context[entityName].Find(id) as INamed; 
if(namedEntity != null) 
    return namedEntity.Name; 
else 
    return string.Empty; 

,那麼你就可以實現這一切在同一行:

return ((INamed)context[entityName].Find(id)).Name; 

請注意,後者的做法將上升或拋出一個異常,如果檢索實體不是implementin g INamed

+0

是的,我的實體沒有擴展任何基類或接口 –

+0

@neelshah,那麼如果發現的實體不包含'Name'屬性,那麼你會期望發生什麼? – haim770

+0

返回一個空字符串,但它會一直在那裏 –

1

如何使用泛型方法指示實體不是按名稱而是按類型來代替?您可以將結果存儲爲動態變量,以便您可以訪問其中的任何屬性。

public string GetEntityByName<TEntity>(int id) 
{ 
    using (var context = new MyContext()) 
    { 
     dynamic entity = context.Set<TEntity>.Find(id); 
     try 
     { 
      return entity.Name; 
     } 
     catch(Exception e) 
     { 
      // Handle the situation when requested entity does not have Name property 
     } 
    } 
} 

或者您可以使用反射來訪問Name屬性:

public string GetEntityByName<TEntity>(int id) 
{ 
    var nameProperty = typeof(TEntity).GetProperty("Name"); 
    if(nameProperty == null) 
     return null; 
    using (var context = new MyContext()) 
    { 
     object entity = context.Set<TEntity>.Find(id); 
     return nameProperty.GetValue(entity) as string; 
    } 
} 

你可以使用類似上述的方法:

string name = GetEntityByName<Car>(id); 

如果你堅持有作爲傳遞的實體類型字符串參數你也可以實現它:

public string GetEntityByName(int id, string entityName) 
{ 
    Type entityType = Type.GetType(entityName); 
    var nameProperty = entityType.GetProperty("Name"); 
    if(nameProperty == null) 
     return null; 
    using (var context = new MyContext()) 
    { 
     object entity = context.Set(entityType).Find(id); 
     return nameProperty.GetValue(entity) as string; 
    } 
} 

僅當GetEntityByName方法在與實體類相同的程序集和相同的名稱空間中定義時,上述方法纔有效。否則,作爲GetType方法的參數,您必須傳遞完整的類型名稱。