创建Expression< Func< T, K>比;在.net运行时

本文关键字:net 运行时 Expression Func 创建 | 更新日期: 2023-09-27 18:12:52

有一个很好的数据库叫LiteDB。我发现不方便的是缺少用于指定实体之间关系类型(值/引用)的属性,尽管LiteDB提供了用于硬编码的流畅接口(详细信息:https://github.com/mbdavid/LiteDB/wiki/DbRef)。我是一个懒惰的人,不想总是更新这些硬编码的关系来跟随数据模型的变化。因此,我决定使用DbRef(我的自定义属性)赋予的属性来实现数据模型实体的运行时发现。不幸的是,我在创建

时遇到了一些困难。
Expression<Func<T,K>> 

在。net运行时…用于在以下调用(第一个参数)中提供它:

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

类型T和K在运行时作为System的实例给出。类型(此处为示例:T -订单,K -客户)。

如果你们能给我一些关于如何实例化

的提示,我将非常感激
Expression<Func<T,K>> 
. net运行时中的

,以便将其提供给…DbRef(…)函数

创建Expression< Func< T, K>比;在.net运行时

那么,您有实体类型T,属性类型K和属性名称。要构建Expression<Func<T, K>>,您可以简单地使用Expression.Parameter, Expression.PropertyExpression.Lambda方法,如下所示:

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

从你的问题。我给你发个截图,也许能给你点提示。

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;
    }

我希望这对你有帮助