2016-10-13 61 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

相关问题