Linq Selector具有动态属性名称

时间:2018-02-08 15:11:23

标签: c# linq dynamic lambda selector

我有function myFunction() { cars.sort(function(a, b){return a.year - b.year}); displayCars(); } function displayCars() { document.getElementById("demo").innerHTML += cars[0].type + " " + cars[0].year + "<br>" + cars[1].type + " " + cars[1].year + "<br>" + cars[2].type + " " + cars[2].year + '<hr>'; } var cars = [{ type: "Volvo", year: 2016 }, { type: "Saab", year: 2001 }, { type: "BMW", year: 2010 }]; displayCars(); // show content myFunction(); // sort and show content其中<div id="demo"></div>是另一个班级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()); 的约束不是一个选项,因为我没有每个参数的类型,我需要定义每种可能性。

有没有办法创建动态lambda选择器来指示我想要获取的属性的字符串名称?

主要目的是使用主键对数据库执行单个查询,并仅选择一个字段(映射的UId列)以提高性能。

我已经阅读了一些解决方案,有些人指出了动态查询,但我更喜欢本机解决方案。

1 个答案:

答案 0 :(得分:1)

您希望创建一个动态表达式并在其上调用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>());

BTW,我认为UId很长。