2016-10-13 55 views
0

存在一個稱爲LiteDB的好數據庫。雖然LiteDB提供流暢的硬編碼接口(詳細信息:https://github.com/mbdavid/LiteDB/wiki/DbRef),但我覺得不方便的是缺少指定實體間關係類型(值/引用)的屬性。我是懶惰的人,不想總是更新這個硬編碼關係,以跟隨我的數據模型中的變化。所以我決定用DbRef屬性(我的自定義屬性)來實現數據模型實體的運行時發現。不幸的是,我堅持一點與.NET運行時創建在.Net Runtime中創建表達式<Func<T,K>>

Expression<Func<T,K>> 

...提供它在下面的調用(第一個參數):

BsonMapper.Global.Entity<Order>().DbRef(x => x.Customer, "customers"); 

類型T和K的給定在運行時作爲System.Type的實例(例如:T - Order,K - Customer)。

我會很感激,如果你們給我如何實例

Expression<Func<T,K>> 
在.NET運行庫

,以提供它... DBREF(...)函數一些提示。

+0

我們有屬性名稱(例如'Customer')? –

+0

是的,我們有屬性名稱。 – Evgeny

+0

爲什麼這個問題是downvoted :(這是否太模糊? – Evgeny

回答

1

好了,你有實體類型T,屬性類型K和屬性名。要構建Expression<Func<T, K>>,你可以簡單地使用Expression.ParameterExpression.PropertyExpression.Lambda方法是這樣的:

var parameter = Expression.Parameter(typeof(T), "x"); 
var body = Expression.Property(parameter, propertyName); 
var selector = Expression.Lambda(body, parameter); 
+0

親愛的伊萬,非常感謝,您的解決方案已經解決了問題! – Evgeny

+0

爲了完整性, 「」可能會被省略。 – Evgeny

+0

但是,結果將只是'LambdaExpression'。我犯了一個錯誤的想法,爲了得到'Expression >'它確實應該是'Expression.Lambda >(... )'。謝謝你的提示! –

-1

從你的問題。讓我發一個截圖,你或許可以給你一個線索Expression> Example

public IEnumerable<TEntity> Fetch(Expression<Func<TEntity, bool>> predicate, Func<IQueryable<TEntity>, 
     IOrderedQueryable<TEntity>> orderBy =null, int? page = null, int? pageSize = null) 
    { 
     IQueryable<TEntity> query = _dbSet; 

     if (orderBy != null) 
     { 
      query = orderBy(query); 
     } 
     if (predicate != null) 
     { 
      query = query.AsExpandable().Where(predicate); 
     } 
     if (page != null && pageSize != null) 
     { 
      query = query.Skip((page.Value - 1) * pageSize.Value).Take(pageSize.Value); 
     } 
     return query; 
    } 

我希望這將有助於

+0

雖然這個鏈接可能回答這個問題,最好包括在這裏的答案的基本部分,並提供參考鏈接。鏈接頁面發生變化 - [發表評論](/ review/low-quality-posts/13975275) – BWA

+0

謝謝。我剛剛編輯帖子 – Fehintola

相關問題