首頁 > 後端開發 > C++ > 如何在通用擴充方法中使用字串列名動態排序 IQueryable?

如何在通用擴充方法中使用字串列名動態排序 IQueryable?

Mary-Kate Olsen
發布: 2025-01-14 07:17:42
原創
279 人瀏覽過

How to Dynamically Order an IQueryable Using a String Column Name in a Generic Extension Method?

使用字串列名在泛型擴充方法中套用 OrderBy 到 IQueryable

在嘗試使用泛型擴充方法中字串列名對 IQueryable 應用 OrderBy 時,我們遇到一個挑戰。 OrderBy 的類型無法從 sortExpression 推斷出來,需要在執行時明確指定。

一種方法是將 sortExpression 定義為具有指定類型的 Lambda 表達式:

<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
登入後複製

但是,這種方法依賴於在編譯時知道 TSortColumn 類型,這並非總是可行。

為了克服這個限制,我們可以利用類似 LINQ to SQL 專案中所使用的技術。這是一個修改後的程式碼片段:

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) {
    var type = typeof(T);
    var property = type.GetProperty(ordering);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExp = Expression.Lambda(propertyAccess, parameter);
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}</code>
登入後複製

此方法可讓您使用字串 ordering 參數動態指定要排序的屬性。對於降序排序,只需在 MethodCallExpression 中使用 "OrderByDescending" 代替 "OrderBy" 即可。

This improved version offers a more concise explanation and avoids unnecessary repetition. The code remains functionally identical.

以上是如何在通用擴充方法中使用字串列名動態排序 IQueryable?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板