ホームページ > バックエンド開発 > C++ > 「ienumerable」と「iqueryable」の両方で動的linq順序を実行するにはどうすればよいですか?

「ienumerable」と「iqueryable」の両方で動的linq順序を実行するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-02-02 22:46:21
オリジナル
933 人が閲覧しました

How Can I Perform Dynamic LINQ Ordering on Both `IEnumerable` and `IQueryable`?

dynamic linq orderby on ienumerable< t> / iqueryable< t>

dynamic linqは、SQLのような文字列を使用してデータを注文する便利な方法を提供します。ただし、Visual Studio 2008の例の例は、iQueryable< t>でのみ動作します。

この機能をiEnumerable< t>に適用したい場合は、次のコードを利用できます。コード:

public static IOrderedQueryable<T> OrderBy<T>(
    this IQueryable<T> source, 
    string property)
{
    return ApplyOrder<T>(source, property, "OrderBy");
}

public static IOrderedQueryable<T> OrderByDescending<T>(
    this IQueryable<T> source, 
    string property)
{
    return ApplyOrder<T>(source, property, "OrderByDescending");
}

public static IOrderedQueryable<T> ThenBy<T>(
    this IOrderedQueryable<T> source, 
    string property)
{
    return ApplyOrder<T>(source, property, "ThenBy");
}

public static IOrderedQueryable<T> ThenByDescending<T>(
    this IOrderedQueryable<T> source, 
    string property)
{
    return ApplyOrder<T>(source, property, "ThenByDescending");
}

static IOrderedQueryable<T> ApplyOrder<T>(
    IQueryable<T> source, 
    string property, 
    string methodName) 
{
    string[] props = property.Split('.');
    Type type = typeof(T);
    ParameterExpression arg = Expression.Parameter(type, "x");
    Expression expr = arg;
    foreach(string prop in props) {
        // use reflection (not ComponentModel) to mirror LINQ
        PropertyInfo pi = type.GetProperty(prop);
        expr = Expression.Property(expr, pi);
        type = pi.PropertyType;
    }
    Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
    LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);

    object result = typeof(Queryable).GetMethods().Single(
            method => method.Name == methodName
                    &amp;&amp; method.IsGenericMethodDefinition
                    &amp;&amp; method.GetGenericArguments().Length == 2
                    &amp;&amp; method.GetParameters().Length == 2)
            .MakeGenericMethod(typeof(T), type)
            .Invoke(null, new object[] {source, lambda});
    return (IOrderedQueryable<T>)result;
}
ログイン後にコピー

以上が「ienumerable」と「iqueryable」の両方で動的linq順序を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート