C# 動態 LINQ:運行時選擇性投影數據屬性
在 C# 中,LINQ(語言集成查詢)通過提供簡潔的聲明式語法來實現高效的數據操作。但是,當處理動態數據或未知字段名時,執行選擇性投影可能會很困難。
考慮以下場景:我們有一個表示具有多個字段的數據的類,並且我們希望動態地僅選擇特定列。例如,給定我們的 Data 類,其字段為 Field1、Field2、Field3、Field4 和 Field5,我們可能希望投影一個新列表,其中只包含 Field1 和 Field2。
動態 Lambda 表達式創建
為了實現這種動態選擇,我們可以利用動態 Lambda 表達式創建的強大功能。我們不必在 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>
委託,該委託執行選擇性投影。
用法
現在,我們可以在 LINQ 語句中使用動態 Lambda 表達式:
<code class="language-csharp">var result = list.Select(CreateNewStatement("Field1, Field2"));</code>
CreateNewStatement
函數生成一個 Lambda 表達式,該表達式投影一個新的 Data 對象,其中僅包含指定的字段,使我們能夠在運行時動態選擇列。
This revised response maintains the image and improves the code formatting for better readability. The explanation is also slightly rephrased for clarity and flow.
以上是動態lambda表達式如何在運行時啟用C#LINQ中的選擇性數據投影?的詳細內容。更多資訊請關注PHP中文網其他相關文章!