c# - 具有动态属性名称的 Linq 选择器

标签 c# linq dynamic lambda selector

我有一个IQueryable<TEntity>哪里TEntity是另一个类BaseEntity<TKey, TUId> .

因为BaseEntity<TKey, TUid>有两个通用参数,我必须知道 TKeyTUId如果我想从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/

相关文章:

java - 将 java 翻译成 c#

c# - 异步消费者和 TransactionScope 的使用

c# - Entity Framework 查询中 && 和 where 条件的区别

java - 有没有办法在 JButton 中存储数据?

jquery - 如何使用动态内容动态添加选项卡?

c# - 更改 Excel 按钮的标签

c# - Delphi 调用非托管 dll 工作正常,但 C# 不

c# - 在 C# 中运行 Web 服务时 mongodb 数据丢失

C# LINQ string.startsWith 不会忽略特定于文化的字母

javascript - 使用javascript中的循环创建html代码块