LINQ中的動態列選擇
當列在編譯時未知時,動態選擇LINQ查詢中的特定列可能具有挑戰性。但是,有一種解決方案涉及動態創建傳遞給Select的lambda表達式。
考慮以下Data類:
<code class="language-csharp">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; } }</code>
為了動態選擇特定列,您可以使用CreateNewStatement方法動態創建lambda表達式:
<code class="language-csharp">private Func<Data, Data> 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<Func<Data, Data>>(xInit, xParameter); return lambda.Compile(); }</code>
此方法將逗號分隔的字段列表作為字符串,並動態生成一個lambda表達式,該表達式使用指定的字段初始化一個新的Data對象。
然後,您可以使用CreateNewStatement方法創建lambda表達式並將其傳遞給Select:
<code class="language-csharp">var result = list.Select(CreateNewStatement("Field1, Field2"));</code>
這將返回一個具有指定字段填充的Data對象的序列。請注意,此技術適用於在編譯時未知所選字段的情況。如果所選字段是靜態的,則使用常規lambda表達式或基於反射的方法效率更高。
以上是如何在LINQ查詢中動態選擇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!