2014-07-13 57 views
0

我有一組實體存儲在sql數據庫中。每個實體都存儲在一個表中。一些實體字段被存儲到列(所以我們可以用它們查詢),但是整個實體實例被序列化爲名爲'JsonContent'的特殊列上的JSON。自定義LINQ數據映射

我希望能夠使用LINQ與這些實體。查詢應支持兩種模式:

  1. 薄對象:查詢項目只包括列字段
  2. 發物:查詢項目包含兩列和「JsonContent」的數據。

如何實現這個目標?

我寫了一個類下面的類:

class Store<TEntity> { 
    public IList<TEntity> Select(
     Expression<Func<TProto, bool>> where, bool fat) {...} 
} 

我翻譯where到SQL。這是重新發明輪子。我該如何擺脫?

回答

0

你應該讓實體框架生成您的數據庫模型,它僅包含1套(你叫什麼你的脂肪的項目),您可以查詢(當然你不能在JSON內查詢,但沒有太大的你可以做到這一點)。

然後,您可以創建一個簡單的C#對象,您將調用thinobject,使其包含所有屬性減去json,並添加一個擴展方法,您將名稱ToThinObject接受一個I​​Queryable並返回一個IQueryable,一個原始的IQueryable

選擇任何你在查詢不兌現(沒有的foreach/Tolist等)想我想避免使用EF的這樣,你可以做

var q = context.MyTable 
    .Where(bla) 
    .Take(bla) 
    .etc etc etc 


var Everything = q.ToList() // retrieves everything including JSON 
var NotEverything = q.ToThinObject().ToList() // contains everything except the JSON, JSON is never retrieved from the database 
+0

。主要是因爲課程將取決於數據庫。我的實體已經從IDL生成。我必須確保數據庫模式匹配IDL(我只在運行時通過ALTER TABLE調用來完成)。 – Gatis

+0

我正在尋找使用反射的解決方案,例如使用表格和列屬性。但是我不能使用它們,因爲類是由第三方工具生成的。 – Gatis

+0

那麼你提到的不是重新發明輪子,如果不使用EF,你將重塑一切。你可以做的是首先使用你已經生成的實體的EF代碼,因爲你只有一個表,它將工作得很好,不管它們是如何完成的,作爲獎勵你可以擺脫你的alter table並讓實體框架自動遷移修改你的數據庫 –