2012-11-22 75 views
1

我是新來的實體框架,我堅持以下。EF EntityObject動態屬性訪問

我有一個已經導入到EDMX模型中的現有數據庫。

我的一些實體共享「所有者」的相同概念。

每個實體都有一個「所有者」的自定義名稱。有時它被命名爲「作者」,有時也稱爲「所有者」,有時以法文「auteur」命名。

所以我實現了一個簡單的接口並創建了部分類,以便我的實體可以共享同一個命名概念「所有者」。

public interface IAPIResource 
{ 
    int owner { get; } 
} 

而且我對實體的博文

public partial class BlogPost : IAPIResource 
{ 
    public int owner { get { return auteur; } } 
} 

現在我想在LINQToEntities查詢使用它,但LINQ告訴我,這是不可能的,因爲IAPIResource不是一個實體型偏類!

public List<T> GetFilteredEntities<T>(int owner, IQueryable<T> entities, MyDBContext db) 
{ 
    return entities.Where(e => ((IAPIResource)e).owner == owner).ToList(); 
} 

我與反思(.GetType.GetProperty.GetValue)嘗試,但LINQ不支持,要麼。

我也嘗試過使用POCO,但沒有多少運氣。

而且我不想用抽象實體等修改我的數據庫模型。

有沒有人有一個簡單的解決方案,而不潛入LINQ表達?

注意:真正的查詢要複雜得多,這就是爲什麼我不願意使用表達式。

謝謝。

回答

2

實體框架不支持顯式的IAPIResource,但你並不需要它,你應該能夠只是做

public List<T> GetFilteredEntities<T>(int owner, IQueryable<T> entities, MyDBContext db) 
    where T : class, IAPIResource 
{ 
    return entities.Where(e => e.owner == owner).ToList(); 
} 

然而,這確實需要你在你的映射屬性owner實施課程。您目前有

public int owner { get { return auteur; } } 

,但是這是行不通的,因爲實體框架將不會看到ownerauteur是相同的屬性。你確實需要稍微改變一下;我個人的偏好是將這個變成:auteurowner的包裝屬性,而不是其他方式。這樣,您可以繼續在代碼中使用auteur,並在查詢中繼續使用owner

+0

嗨hvd,謝謝你的回答。我可能會錯過一些東西,但我嘗試了您的解決方法,但它也不起作用。 LINQ仍然告訴我它不能將BlogPost轉換爲IAPIResource,因爲它不是原始的EDM類型。你應該注意到代碼中的「,class」似乎不正確(我使用VS2010,.NET 4.0),所以我放棄了它。 –

+0

@ user1844726哎呀,對不起。 'class'是必需的,但我錯了。固定。 – hvd

+0

我試圖實現你提出的「包裝」,但我無法弄清楚如何在我的代碼中引入它。你能舉一個例子來說明如何實現它嗎?它是在EDMX實體BlogPost中添加的標量屬性嗎?但是我不能重寫它。非常感謝你的幫助 –