我有一个IQueryable<TEntity>
哪里TEntity
是另一个类BaseEntity<TKey, TUId>
.
因为BaseEntity<TKey, TUid>
有两个通用参数,我必须知道 TKey
和TUId
如果我想从IQueryable
中选择一列,请提前输入.
但我也知道BaseEntity<TKey, TUId>
将始终有一个名为 UId
的数字属性,这就是我需要得到的。
我想要实现的目标类似于下面的代码,我可以在其中定义一个选择器变量,其中包含我希望查询选择的属性,但是是动态的。就像在字符串变量中设置这个名称一样。
var selector = nameof(BaseEntity<,>.UId);
IQueryable<TEntity> query = GetQueryByPrimaryKey();
var entityUId = Convert.ToInt64(query.Select(selector).Single());
在 TEntity
中存在约束仅接受BaseEntity<TKey, TUId>
不是一个选项,因为我没有每个参数的类型,并且我需要定义每种可能性。
有没有办法创建动态 lambda 选择器来指示我想要获取的属性的字符串名称?
主要目标是使用主键对数据库执行单个查询并仅选择一个字段(映射的 UId 列)以提高性能。
我已经阅读了一些解决方案,其中一些指出了动态查询,但我更喜欢 native 解决方案。
最佳答案
看起来您想要创建一个动态表达式并对其调用Select
:
private Expression<Func<BaseEntity<TKey, TUId>, long>> CreateUIdExpression<TKey,
TUId>()
{
var param = Expression.Parameter(typeof(BaseEntity<TKey, TUId>));
var memberExpression = Expression.Property(param, "UId");
var expr = Expression.Lambda<Func<BaseEntity<TKey, TUId>, long>>(memberExpression, param);
return expr;
}
用法:
var newQuery = query.Select(CreateUIdExpression<TKey, TUId>());
顺便说一句,我假设 UId 很长。
关于c# - 具有动态属性名称的 Linq 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688724/