在 .Net 运行时创建表达式<Func<T,K>>

Create Expression<Func<T,K>> in .Net Runtime

有一个名为 LiteDB 的不错的数据库。我发现不方便的是缺少用于指定实体之间的关系类型 (value/reference) 的属性,尽管 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.Type 的实例给出(此处示例:T - 订单,K - 客户)。

如果你们能给我一些关于如何实例化的提示,我将不胜感激

Expression<Func<T,K>> 

在 .Net 运行时中以便将其提供给 ...DbRef(...) 函数。

来自你的提问。让我把截图发给你,也许它能给你一些线索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;
    }

希望对您有所帮助

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

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