【发布时间】:2012-01-25 10:01:11
【问题描述】:
我昨天问了very similar question,但直到今天我才意识到我接受的答案并不能解决我所有的问题。我有以下代码:
public Expression<Func<TItem, object>> SelectExpression<TItem>(string fieldName)
{
var param = Expression.Parameter(typeof(TItem), "item");
var field = Expression.Property(param, fieldName);
return Expression.Lambda<Func<TItem, object>>(field,
new ParameterExpression[] { param });
}
具体用法如下:
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
这允许我从IQueryable<TUnknown> 中提取主键。问题是此代码仅适用于单个主键,我需要添加对多个 PK 的支持。
那么,我有什么办法可以调整上面的 SelectExpression 方法以采用 IEnumerable<string>(这是我的主键属性名称列表)并让该方法返回一个选择这些键的表达式?
即鉴于以下情况:
var knownRuntimePrimaryKeys = new string[] { "CustomerId", "OrderId" }`
我的 Select 需要执行以下操作(在运行时):
var primaryKeys = query.Select(x=> new { x.CustomerId, x.OrderId });
【问题讨论】:
-
问题是作为select statemet结果的匿名类型是在编译时创建的..
-
除了使用 Anonymous 类型之外,还有其他方法可以达到我的要求吗?还是回到绘图板上?
-
@GenericTypeTea,元组对你来说是一个可以接受的选项吗?
-
@ThomasLevesque 是的,我不明白为什么不这样做。你想到了什么?
-
@GenericTypeTea,我会在几分钟后发布答案
标签: c# linq lambda duck-typing