Rumah > pembangunan bahagian belakang > C++ > Bolehkah pesanan linq dinamik digunakan untuk `ienumerable` serta` iQueryable`?

Bolehkah pesanan linq dinamik digunakan untuk `ienumerable` serta` iQueryable`?

Patricia Arquette
Lepaskan: 2025-02-02 22:41:10
asal
389 orang telah melayarinya

Can Dynamic LINQ Ordering Be Applied to `IEnumerable` as Well as `IQueryable`?

Dynamic Linq Orderby pada iEnumerable & lt; t & gt; / IQueryable & lt; t & gt;

Di Linq dinamik, anda boleh menggunakan rentetan seperti SQL (mis., "Orderby (" Nama, umur desc ")") untuk memerintahkan hasilnya. Walau bagaimanapun, contoh -contoh yang tersedia setakat ini hanya berfungsi dengan iqueryable & lt; t & gt;. Ini menimbulkan persoalan: Adakah mungkin untuk memperluaskan fungsi ini kepada iEnumerable & lt; t & gt ;?

yang diperluaskan kepada ienumerable & lt; t & gt; Kaedah yang menggunakan asqueryable. Walau bagaimanapun, kod di bawah ini berfungsi sebagai logik ekspresi teras yang diperlukan:

menggabungkan fungsi dinamik
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 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
                    && method.IsGenericMethodDefinition
                    && method.GetGenericArguments().Length == 2
                    && method.GetParameters().Length == 2)
            .MakeGenericMethod(typeof(T), type)
            .Invoke(null, new object[] { source, lambda });
    return (IOrderedQueryable<T>)result;
}
Salin selepas log masuk

untuk senario linq-to-objects dinamik, anda boleh memanfaatkan sistem .Dynamic untuk lebih banyak fleksibiliti.

Atas ialah kandungan terperinci Bolehkah pesanan linq dinamik digunakan untuk `ienumerable` serta` iQueryable`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan