LINQ中的动态列选择
当列在编译时未知时,动态选择LINQ查询中的特定列可能具有挑战性。但是,有一种解决方案涉及动态创建传递给Select的lambda表达式。
考虑以下Data类:
public class Data
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
public string Field4 { get; set; }
public string Field5 { get; set; }
}
为了动态选择特定列,您可以使用CreateNewStatement方法动态创建lambda表达式:
private Func CreateNewStatement(string fields)
{
var xParameter = Expression.Parameter(typeof(Data), "o");
var xNew = Expression.New(typeof(Data));
var bindings = fields.Split(',')
.Select(o => o.Trim())
.Select(o =>
{
var mi = typeof(Data).GetProperty(o);
var xOriginal = Expression.Property(xParameter, mi);
return Expression.Bind(mi, xOriginal);
});
var xInit = Expression.MemberInit(xNew, bindings);
var lambda = Expression.Lambda>(xInit, xParameter);
return lambda.Compile();
}
此方法将逗号分隔的字段列表作为字符串,并动态生成一个lambda表达式,该表达式使用指定的字段初始化一个新的Data对象。
然后,您可以使用CreateNewStatement方法创建lambda表达式并将其传递给Select:
var result = list.Select(CreateNewStatement("Field1, Field2"));
这将返回一个具有指定字段填充的Data对象的序列。请注意,此技术适用于在编译时未知所选字段的情况。如果所选字段是静态的,则使用常规lambda表达式或基于反射的方法效率更高。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3