考慮以下包含多個字段的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>
假設您想從Data對象的列表中動態選擇特定的列,例如,只檢索Field1和Field2。在編譯時不知道所選字段並且必須在運行時指定這些字段的場景中,使用動態LINQ是一種有效的方法。
為了動態實現這一點,我們可以動態創建一個lambda表達式:
<code class="language-csharp">Func<Data, Data> CreateNewStatement(string fields) { // 输入参数 "o" var xParameter = Expression.Parameter(typeof(Data), "o"); // 新语句 "new Data()" var xNew = Expression.New(typeof(Data)); // 创建初始化器 var bindings = fields.Split(',').Select(o => o.Trim()).Select(o => { // 属性 "Field1" var mi = typeof(Data).GetProperty(o); // 原始值 "o.Field1" var xOriginal = Expression.Property(xParameter, mi); // 设置值 "Field1 = o.Field1" return Expression.Bind(mi, xOriginal); }); // 初始化 "new Data { Field1 = o.Field1, Field2 = o.Field2 }" var xInit = Expression.MemberInit(xNew, bindings); // 表达式 "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }" var lambda = Expression.Lambda<Func<Data, Data>>(xInit, xParameter); // 编译为 Func<Data, Data> return lambda.Compile(); }</code>
此方法接受所需字段名稱的字符串作為輸入,並返回一個Func<Data, Data>
lambda表達式。該lambda表達式動態創建一個具有指定字段值的新Data對象,從而選擇這些字段。
使用此方法,我們可以像這樣從Data列表中選擇特定列:
<code class="language-csharp">var result = list.Select(CreateNewStatement("Field1, Field2"));</code>
即使在編譯時不知道所選字段,這也能為在LINQ查詢中選擇列提供動態且靈活的解決方案。
以上是動態LINQ如何在C#中啟用動態列選擇?的詳細內容。更多資訊請關注PHP中文網其他相關文章!