gpt4 book ai didi

c# - 如何在运行时在 IEnumerable 上创建动态多属性 Select?

转载 作者:太空狗 更新时间:2023-10-29 21:35:40 25 4
gpt4 key购买 nike

我问了一个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" }`

My Select 需要执行以下操作(在运行时):

var primaryKeys = query.Select(x=> new { x.CustomerId, x.OrderId });

最佳答案

没有简单的方法可以准确地完成您想要的操作,因为它需要您动态创建一个新类型(匿名类型是静态已知的,由编译器创建)。虽然这当然可行,但可能不是最简单的选择...

您可以使用 tuples 获得类似的结果:

public Expression<Func<TItem, object>> SelectExpression<TItem>(string[] propertyNames)
{
var properties = propertyNames.Select(name => typeof(TItem).GetProperty(name)).ToArray();
var propertyTypes = properties.Select(p => p.PropertyType).ToArray();
var tupleTypeDefinition = typeof(Tuple).Assembly.GetType("System.Tuple`" + properties.Length);
var tupleType = tupleTypeDefinition.MakeGenericType(propertyTypes);
var constructor = tupleType.GetConstructor(propertyTypes);
var param = Expression.Parameter(typeof(TItem), "item");
var body = Expression.New(constructor, properties.Select(p => Expression.Property(param, p)));
var expr = Expression.Lambda<Func<TItem, object>>(body, param);
return expr;
}

关于c# - 如何在运行时在 IEnumerable<T> 上创建动态多属性 Select?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com