创建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(…)函数
那么,您有实体类型T
,属性类型K
和属性名称。要构建Expression<Func<T, K>>
,您可以简单地使用Expression.Parameter
, Expression.Property
和Expression.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;
}
我希望这对你有帮助