我有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列)以提高性能。
我已经阅读了一些解决方案,有些人指出了动态查询,但我更喜欢本机解决方案。
答案 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很长。