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