আইনিউমারেবল <T> / আইকোয়্যারেবল <T> এ গতিশীল লিনকুই অর্ডার


668

ডায়নামিক লিংকউ এর জন্য ভিএস ২০০৮ এর উদাহরণগুলিতে আমি একটি উদাহরণ পেয়েছি যা আপনাকে বর্গক্ষেত্রের মতো স্ট্রিং ব্যবহার করতে দেয় (যেমন OrderBy("Name, Age DESC"))অর্ডার দেওয়ার জন্য। দুর্ভাগ্যক্রমে, অন্তর্ভুক্ত পদ্ধতিটি কেবলমাত্র কাজ করে IQueryable<T>this এই কার্যকারিতাটি পেতে কোনও উপায় আছে কি IEnumerable<T>?


1
আমার মতামত অনুসারে এই তারিখের সেরা উত্তর: সিস্টেম.লিনক.ডায়নামিক.কোর লাইব্রেরি।
শাহিন দোহান

উত্তর:


904

শুধু এই পুরানো মধ্যে হোঁচট খেয়েছি ...

ডায়নামিক লিনকু লাইব্রেরি ছাড়াই এটি করতে আপনার নীচের মত কোডের প্রয়োজন। এটি নেস্টেড বৈশিষ্ট্য সহ বেশিরভাগ সাধারণ দৃশ্যের অন্তর্ভুক্ত।

এটির সাথে কাজ করার জন্য IEnumerable<T>আপনি কয়েকটি মোড়কের পদ্ধতি যুক্ত করতে পারেন যা দিয়ে AsQueryable- তবে নীচের কোডটি মূল Expressionযুক্তিকেই প্রয়োজনীয়।

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

সম্পাদনা করুন: আপনি যদি এটির সাথে মিশতে চান তবে এটি আরও মজা পায় dynamic- যদিও নোট করুন যে dynamicকেবলমাত্র লিনিকিউ-টু-অবজেক্টের ক্ষেত্রে প্রযোজ্য (ওআরএম-এর জন্য এক্সপ্রেশন-ট্রি ইত্যাদি সত্যিই dynamicপ্রশ্নের প্রতিনিধিত্ব করতে পারে না - MemberExpressionসমর্থন করে না)। তবে লিনকিউ-টু-অবজেক্টের সাথে এটি করার একটি উপায়। নোট করুন যে পছন্দটি Hashtableঅনুকূল লকিং শব্দার্থবিজ্ঞানের কারণে:

using Microsoft.CSharp.RuntimeBinder;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Runtime.CompilerServices;
static class Program
{
    private static class AccessorCache
    {
        private static readonly Hashtable accessors = new Hashtable();

        private static readonly Hashtable callSites = new Hashtable();

        private static CallSite<Func<CallSite, object, object>> GetCallSiteLocked(
            string name) 
        {
            var callSite = (CallSite<Func<CallSite, object, object>>)callSites[name];
            if(callSite == null)
            {
                callSites[name] = callSite = CallSite<Func<CallSite, object, object>>
                    .Create(Binder.GetMember(
                                CSharpBinderFlags.None, 
                                name, 
                                typeof(AccessorCache),
                                new CSharpArgumentInfo[] { 
                                    CSharpArgumentInfo.Create(
                                        CSharpArgumentInfoFlags.None, 
                                        null) 
                                }));
            }
            return callSite;
        }

        internal static Func<dynamic,object> GetAccessor(string name)
        {
            Func<dynamic, object> accessor = (Func<dynamic, object>)accessors[name];
            if (accessor == null)
            {
                lock (accessors )
                {
                    accessor = (Func<dynamic, object>)accessors[name];
                    if (accessor == null)
                    {
                        if(name.IndexOf('.') >= 0) {
                            string[] props = name.Split('.');
                            CallSite<Func<CallSite, object, object>>[] arr 
                                = Array.ConvertAll(props, GetCallSiteLocked);
                            accessor = target =>
                            {
                                object val = (object)target;
                                for (int i = 0; i < arr.Length; i++)
                                {
                                    var cs = arr[i];
                                    val = cs.Target(cs, val);
                                }
                                return val;
                            };
                        } else {
                            var callSite = GetCallSiteLocked(name);
                            accessor = target =>
                            {
                                return callSite.Target(callSite, (object)target);
                            };
                        }
                        accessors[name] = accessor;
                    }
                }
            }
            return accessor;
        }
    }

    public static IOrderedEnumerable<dynamic> OrderBy(
        this IEnumerable<dynamic> source, 
        string property)
    {
        return Enumerable.OrderBy<dynamic, object>(
            source, 
            AccessorCache.GetAccessor(property), 
            Comparer<object>.Default);
    }

    public static IOrderedEnumerable<dynamic> OrderByDescending(
        this IEnumerable<dynamic> source, 
        string property)
    {
        return Enumerable.OrderByDescending<dynamic, object>(
            source, 
            AccessorCache.GetAccessor(property), 
            Comparer<object>.Default);
    }

    public static IOrderedEnumerable<dynamic> ThenBy(
        this IOrderedEnumerable<dynamic> source, 
        string property)
    {
        return Enumerable.ThenBy<dynamic, object>(
            source, 
            AccessorCache.GetAccessor(property), 
            Comparer<object>.Default);
    }

    public static IOrderedEnumerable<dynamic> ThenByDescending(
        this IOrderedEnumerable<dynamic> source, 
        string property)
    {
        return Enumerable.ThenByDescending<dynamic, object>(
            source, 
            AccessorCache.GetAccessor(property), 
            Comparer<object>.Default);
    }

    static void Main()
    {
        dynamic a = new ExpandoObject(), 
                b = new ExpandoObject(), 
                c = new ExpandoObject();
        a.X = "abc";
        b.X = "ghi";
        c.X = "def";
        dynamic[] data = new[] { 
            new { Y = a },
            new { Y = b }, 
            new { Y = c } 
        };

        var ordered = data.OrderByDescending("Y.X").ToArray();
        foreach (var obj in ordered)
        {
            Console.WriteLine(obj.Y.X);
        }
    }
}

109
আমি দেখেছি সর্বোত্তম জঘন্য কোডটি :) কেবলমাত্র আমার প্রকল্পের এক মিলিয়ন সমস্যার সমাধান করেছেন :)
sajidnizami

4
@ ডেভ - আপনার সাথে এটি শুরু করা দরকার IQueryable<T>, সুতরাং আপনার যদি এমন কিছু List<T>(যা হয় IEnumerable<T>) ব্যবহারের প্রয়োজন হতে পারে AsQueryable()- উদাহরণস্বরূপvar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
মার্ক গ্র্যাভেল

7
আপনি কি এটি দেখেছেন ... এটি কিছু লোককে সহায়তা করতে পারে ... এটি একটি আরও দৃ strongly ়ভাবে টাইপযুক্ত সমাধান ack
এন্থনিভ

28
@ এমজিও আপনি কোডের প্রকৃতি ভুল বোঝে বলে মনে হয়। 40 টি লাইনগুলি আপনার প্রকল্পে কোথাও 40 রেখাগুলি রেখে দেওয়া বা সেগুলি লাইনগুলি (প্রাক-সংকলিত, বা উত্স হিসাবে) কোনও বাহ্যিক লাইব্রেরিতে আসে তা বিবেচনা করেই তা সমান। যদি আমি অক্টোবরে '08-এ ডিসেম্বর '11 সাল থেকে নুগেটের একটি লাইব্রেরির সাথে সংযুক্ত করে থাকি তবে এটি বেশ আশ্চর্যজনক হত (নুগেটের তখন কোনও উপস্থিতি ছিল না) তবে মৌলিক "এটি যা করছে" তা হ'ল একই. এছাড়াও, আপনি "প্রকৃত সমাধান" বাক্যাংশটি ব্যবহার করেন যেমন প্রতিটি কোডিং প্রশ্নের কিছু সংজ্ঞায়িত একক পথ রয়েছে: সেখানে নেই there
মার্ক গ্রাভেল

5
@ এমজিওউইন বিটিডব্লু, বহিরাগত লাইবটি কোডের 2296 লাইন (এসেম্বলিআইএনফো সহ নয়); কোন ধরণের এখানে 40 লাইনগুলি বেশ যুক্তিসঙ্গত দেখাচ্ছে
মার্ক গ্রাভেল

231

কোনও জটিলতা ছাড়াই খুব সহজ:

  1. যোগ using System.Linq.Dynamic;উপরের।
  2. ব্যবহার vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();

11
এবং আপনি কোথা System.Linq.Dynamicথেকে পেয়েছেন?
ডেমেন্টিক

1
মংগোডিবিতে লিনাক ব্যবহার করার সময়ও কাজ করে।
soupy1976

32
গৃহীত উত্তরটি ২০০৮ সালে সঠিক উত্তর হতে পারে তবে বর্তমানে এটি এখন সবচেয়ে সহজ, সবচেয়ে সঠিক উত্তর।
EL MOJO

1
এটি সত্যিই ভাল এবং সাধারণ পরিচালনা, অভ্যন্তরীণভাবে এত জটিলতা এটি পছন্দ করেছে
মৃণাল কাম্বুজ

5
"ভবিষ্যতের" লোকের জন্য, আপনি যদি ডটনেট কোর ব্যবহার করছেন তবে এটি ব্যবহার করুন: nuget.org/packages/System.Linq.Dynamic.Core
রাফায়েল মেরলিন

78

আমি উত্তর খুঁজে পেয়েছি। আমি .AsQueryable<>()আমার তালিকাটি আইকুয়ে্যারেবলে রূপান্তর করতে এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারি, তারপরে গতিশীল ক্রমটি এটির বিরুদ্ধে চালাতে পারি।


52
আমাদের বাকি জন্য একটি উদাহরণ প্রদান করুন।
এমজিওউইন

54

এই প্রশ্নটি পেরিয়ে শুধু হোঁচট খেয়েছে।

উপর থেকে মার্কের অ্যাপ্লিকেশন অর্ডার বাস্তবায়নটি ব্যবহার করে, আমি একটি এক্সটেনশন পদ্ধতি একসাথে চড় দিয়েছি যা এসকিউএল-এর মতো স্ট্রিংগুলি পরিচালনা করে:

list.OrderBy("MyProperty DESC, MyOtherProperty ASC");

বিশদগুলি এখানে পাওয়া যাবে: http://aonnull.blogspot.com/2010/08/dynamic-sql- Like-linq-orderby-extension.html


1
দুর্দান্ত জিনিস, সম্পত্তি নামের কেসকে সংবেদনশীল করার জন্য কেবল নিম্নলিখিত হিসাবে একটি সংশোধন করুন: প্রপার্টিআইএনফো পিআই = টাইপ.গেটপ্রোপার্টি (প্রোপ, বাইন্ডিংফ্ল্যাজস.পাবলিক | বাইন্ডিংফ্লাগস।ইনস্ট্যান্স | বাইন্ডিংফ্লাগস।আইগনরেসেস);
মৃণাল কামবুজ

43

আমার ধারণা, আপনি যে ধরণের সম্পত্তি বাছাই করতে চান তা পেতে প্রতিচ্ছবিটি ব্যবহার করা কাজ করবে:

IEnumerable<T> myEnumerables
var query=from enumerable in myenumerables
          where some criteria
          orderby GetPropertyValue(enumerable,"SomeProperty")
          select enumerable

private static object GetPropertyValue(object obj, string property)
{
    System.Reflection.PropertyInfo propertyInfo=obj.GetType().GetProperty(property);
    return propertyInfo.GetValue(obj, null);
}

মনে রাখবেন যে প্রতিবিম্বটি ব্যবহার করে সরাসরি সম্পত্তি অ্যাক্সেস করার চেয়ে যথেষ্ট ধীর হয়, তাই কার্য সম্পাদন তদন্ত করতে হবে।


এটি কি কাজ করে? অর্ডারবাই কোনও মান চাই না তবে একটি নির্বাচক লাম্বা / প্রতিনিধি (ফানক <টিসোর্স, টিকিএ> কীস্লিটর) ..
ডেভি ল্যান্ডম্যান

2
আমি পোস্ট করার আগে এই উদাহরণটি চেষ্টা করেছিলাম, এবং হ্যাঁ, এটি কাজ করে।
কেজেটিল ওয়াটনেডাল

3
+1 ঠিক এটিই আমি খুঁজছিলাম! এটি সহজ পৃষ্ঠা বাছাইয়ের সমস্যাগুলির জন্য দুর্দান্ত কাজ করবে।
অ্যান্ড্রু সিমার

এটি আমার পক্ষে কাজ করে না। আমি কিছু অনুপস্থিত করছি? "সাম্প্রোপার্টি" কী হওয়া উচিত। আমি সম্পত্তিটির পাশাপাশি সম্পত্তিটির নাম দেওয়ার চেষ্টা করেছি et গেটটাইপ ()। আমার কাছে আইকোয়্যারেবল <> এবং আইনিউবারেবল নয় <>
সুতরাং ব্যবহারকারী

2
@ অ্যালেক্স শকোর: সমস্ত উপাদান না দেখে আপনার কীভাবে উপাদানগুলি বাছাই করার কথা? তবে অন্যান্য উত্তরের আরও ভাল সমাধান রয়েছে।
কেজেটিল ওয়াটনেডাল

19

অন্যরা যা বলেছে কেবল তা নিয়েই বিল্ডিং। আমি দেখতে পেয়েছি যে নিম্নলিখিতগুলি বেশ ভালভাবে কাজ করে।

public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> input, string queryString)
{
    if (string.IsNullOrEmpty(queryString))
        return input;

    int i = 0;
    foreach (string propname in queryString.Split(','))
    {
        var subContent = propname.Split('|');
        if (Convert.ToInt32(subContent[1].Trim()) == 0)
        {
            if (i == 0)
                input = input.OrderBy(x => GetPropertyValue(x, subContent[0].Trim()));
            else
                input = ((IOrderedEnumerable<T>)input).ThenBy(x => GetPropertyValue(x, subContent[0].Trim()));
        }
        else
        {
            if (i == 0)
                input = input.OrderByDescending(x => GetPropertyValue(x, subContent[0].Trim()));
            else
                input = ((IOrderedEnumerable<T>)input).ThenByDescending(x => GetPropertyValue(x, subContent[0].Trim()));
        }
        i++;
    }

    return input;
}

12

আমি লিনকের একাধিক অর্ডারবাইয়ের ধারাটির সন্ধানে এই প্রশ্নটি হোঁচট খেয়েছি এবং সম্ভবত লেখক এটিই খুঁজছিলেন

এটি কীভাবে করা যায় তা এখানে:

var query = pets.OrderBy(pet => pet.Name).ThenByDescending(pet => pet.Age);    

5
+1 ব্যাখ্যার অভাবে ডাউন-ভোট বাতিল করেছে। আমি আরও মনে করি লেখক একাধিক অর্ডার-বাইতে আগ্রহী হতে পারে। এমনকি যদি গতিশীল ছিল কী শব্দ, নিচে-ভোট কোনো কারণ।
জেসন ক্লেবান

11

আমি এটি করার চেষ্টা করছিলাম তবে কেজেটিল ওয়াটনেডালের সমাধানে সমস্যা হচ্ছিল কারণ আমি ইনলাইন লিনাক সিনট্যাক্সটি ব্যবহার করি না - আমি পদ্ধতি-শৈলীর বাক্য গঠন পছন্দ করি। আমার নির্দিষ্ট সমস্যাটি কাস্টম ব্যবহার করে গতিশীল বাছাই করার চেষ্টা করছিল IComparer

আমার সমাধানটি এভাবে শেষ হয়েছিল:

এর মতো একটি আইকিউয়েরেবল ক্যোয়ারী দেওয়া হয়েছে:

List<DATA__Security__Team> teams = TeamManager.GetTeams();
var query = teams.Where(team => team.ID < 10).AsQueryable();

এবং একটি রান-টাইম সাজানোর ক্ষেত্র যুক্তি দেওয়া হয়েছে:

string SortField; // Set at run-time to "Name"

গতিশীল অর্ডারবাই এর মত দেখাচ্ছে:

query = query.OrderBy(item => item.GetReflectedPropertyValue(SortField));

এবং এটি গেটর্যাফলেটেডপ্রোপার্টিভ্যালু () নামে একটি সামান্য সহায়ক পদ্ধতি ব্যবহার করছে:

public static string GetReflectedPropertyValue(this object subject, string field)
{
    object reflectedValue = subject.GetType().GetProperty(field).GetValue(subject, null);
    return reflectedValue != null ? reflectedValue.ToString() : "";
}

একটি শেষ জিনিস - আমি উল্লেখ করেছি যে আমি OrderByকাস্টমটি ব্যবহার করতে চেয়েছিলাম IComparer- কারণ আমি প্রাকৃতিক বাছাই করতে চেয়েছিলাম ।

এটি করার জন্য, আমি কেবল এটিকে পরিবর্তন করেছি OrderBy:

query = query.OrderBy(item => item.GetReflectedPropertyValue(SortField), new NaturalSortComparer<string>());

কোডের জন্য এই পোস্টটি দেখুন NaturalSortComparer()


5

গতিশীল ব্যবহার করুন linq

শুধু যোগ কর using System.Linq.Dynamic;

এবং আপনার সমস্ত কলামগুলি অর্ডার করতে এটি ব্যবহার করুন:

string sortTypeStr = "ASC"; // or DESC
string SortColumnName = "Age"; // Your column name
query = query.OrderBy($"{SortColumnName} {sortTypeStr}");

4

আপনি এটি যোগ করতে পারে:

public static IEnumerable<T> OrderBy( this IEnumerable<T> input, string queryString) {
    //parse the string into property names
    //Use reflection to get and sort by properties
    //something like

    foreach( string propname in queryString.Split(','))
        input.OrderBy( x => GetPropertyValue( x, propname ) );

    // I used Kjetil Watnedal's reflection example
}

GetPropertyValueফাংশন থেকে Kjetil Watnedal এর উত্তর

বিষয়টি কেন হবে? এই ধরণের যে কোনও ধরণের সময় সংকলন না করে রান-টাইমে ব্যতিক্রম ছুঁড়ে ফেলা হবে (ডি 2 ভিআইএনটির উত্তর মত)।

আপনি যদি লিনাকের সাথে এসকিএল নিয়ে কাজ করছেন এবং অর্ডারবাইটি একটি এক্সপ্রেশন ট্রি হয় তবে তা কার্যকর করার জন্য এটি এসকিউএল রূপান্তরিত হবে।


GetPropertyValue mehotod সকল উপাদানগুলির জন্য কার্যকর করা হবে, এটির খারাপ সমাধান।
অ্যালেক্স শকোর

2
OrderByআগের অর্ডার বজায় রাখবেন না !!
আমির ইসমাইল

4

আমি আকর্ষণীয় অন্য কিছু এখানে। যদি আপনার উত্স কোনও ডেটা টেবিল হয়, আপনি ডায়নামিক লিনক ব্যবহার না করে গতিশীল বাছাই ব্যবহার করতে পারেন

DataTable orders = dataSet.Tables["SalesOrderHeader"];
EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<DateTime>("OrderDate")
                                         select order;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;

তথ্যসূত্র: http://msdn.microsoft.com/en-us/library/bb669083.aspx (ডেটাসেট এক্সটেনশনগুলি ব্যবহার করে)

এটি একটি ডেটাভিউতে রূপান্তরিত করে আরও একটি উপায়:

DataTable contacts = dataSet.Tables["Contact"];    
DataView view = contacts.AsDataView();    
view.Sort = "LastName desc, FirstName asc";    
bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

4

মার্টেনকে ধন্যবাদ ( লিনকিউতে সম্পত্তিInfo অবজেক্টটি ব্যবহার করে একটি সংগ্রহ অনুসন্ধান করুন ) আমি এই সমাধান পেয়েছি:

myList.OrderByDescending(x => myPropertyInfo.GetValue(x, null)).ToList();

আমার ক্ষেত্রে আমি একটি "কলামহিডারমাউস ক্লিক" (উইন্ডোজফর্ম) এ কাজ করছিলাম সুতরাং সবেমাত্র নির্দিষ্ট কলামটি চাপা পড়েছে এবং এর সংবাদদাতা প্রপার্টিআইইনফো পেয়েছি:

foreach (PropertyInfo column in (new Process()).GetType().GetProperties())
{
    if (column.Name == dgvProcessList.Columns[e.ColumnIndex].Name)
    {}
}

অথবা

PropertyInfo column = (new Process()).GetType().GetProperties().Where(x => x.Name == dgvProcessList.Columns[e.ColumnIndex].Name).First();

(আপনার কলামের নামগুলি বস্তুর বৈশিষ্ট্যের সাথে মিল রয়েছে তা নিশ্চিত হন)

চিয়ার্স


4

অনেক অনুসন্ধানের পরেও এটি আমার পক্ষে কাজ করেছে:

public static IEnumerable<TEntity> OrderBy<TEntity>(this IEnumerable<TEntity> source, 
                                                    string orderByProperty, bool desc)
{
    string command = desc ? "OrderByDescending" : "OrderBy";
    var type = typeof(TEntity);
    var property = type.GetProperty(orderByProperty);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExpression = Expression.Lambda(propertyAccess, parameter);
    var resultExpression = Expression.Call(typeof(Queryable), command, 
                                           new[] { type, property.PropertyType },
                                           source.AsQueryable().Expression, 
                                           Expression.Quote(orderByExpression));
    return source.AsQueryable().Provider.CreateQuery<TEntity>(resultExpression);
}


3

একটি বিকল্প সমাধান নিম্নলিখিত শ্রেণী / ইন্টারফেস ব্যবহার করে। এটি সত্যই গতিশীল নয়, তবে এটি কার্যকর।

public interface IID
{
    int ID
    {
        get; set;
    }
}

public static class Utils
{
    public static int GetID<T>(ObjectQuery<T> items) where T:EntityObject, IID
    {
        if (items.Count() == 0) return 1;
        return items.OrderByDescending(u => u.ID).FirstOrDefault().ID + 1;
    }
}

2

এই উত্তরটি সেই মন্তব্যের প্রতিক্রিয়া যা @ জন শিহান - রানস্কোপ দ্বারা সরবরাহিত সমাধানের জন্য উদাহরণের প্রয়োজন

আমাদের বাকি জন্য একটি উদাহরণ প্রদান করুন।

ডালে (ডেটা অ্যাক্সেস স্তর),

মূল সংস্করণ:

  public  IEnumerable<Order> GetOrders()
    {
      // i use Dapper to return IEnumerable<T> using Query<T>
      //.. do stuff
      return  orders  // IEnumerable<Order>
  }

আইকিউয়েরেবল সংস্করণ

  public IQueryable<Order> GetOrdersAsQuerable()
    {
        IEnumerable<Order> qry= GetOrders();
        //use the built-in extension method  AsQueryable in  System.Linq namespace
        return qry.AsQueryable();            
    }

এখন আপনি বাঁধাই করতে আইকুয়েরেবল সংস্করণ ব্যবহার করতে পারেন, উদাহরণস্বরূপ গ্রথভিউ Asp.net এ এবং বাছাইয়ের জন্য উপকারী (আপনি IEnumerable সংস্করণ ব্যবহার করে বাছাই করতে পারবেন না)

আমি ড্যাপারকে ওআরএম হিসাবে ব্যবহার করি এবং আইকিউয়েরেবল সংস্করণ তৈরি করি এবং এপিএনটিতে গ্রিডভিউতে বাছাই করা এত সহজ।


2

প্রথমে গতিশীল সরঞ্জামগুলি ইনস্টল করুন -> নিউগেট প্যাকেজ ম্যানেজার -> প্যাকেজ ম্যানেজার কনসোল

install-package System.Linq.Dynamic

যোগ নামস্থান using System.Linq.Dynamic;

এখন আপনি ব্যবহার করতে পারেন OrderBy("Name, Age DESC")


আমি কীভাবে এটি অভ্যন্তরীণ সম্পত্তি বাছাইয়ের সাথে ব্যবহার করতে পারি - যেমন অর্ডারবাই ("ব্রাঞ্চ। ব্রাঞ্চনাম", "অবতরণ")
ডিভিসি

এটি আমার পক্ষে কাজ করে। সম্ভবত প্রশ্নটি 10 ​​বছরের পুরানো এবং এই সহজ পদ্ধতিটি পরে এসেছিল।
কোশারজেলিফিশ

1

আপনি এটি ব্যবহার করতে পারেন:

        public List<Book> Books(string orderField, bool desc, int skip, int take)
{
    var propertyInfo = typeof(Book).GetProperty(orderField);

    return _context.Books
        .Where(...)
        .OrderBy(p => !desc ? propertyInfo.GetValue(p, null) : 0)
        .ThenByDescending(p => desc ? propertyInfo.GetValue(p, null) : 0)
        .Skip(skip)
        .Take(take)
        .ToList();
}

কয়েক বছর পরে এবং আমি এটিতে হোঁচট খাচ্ছি; এটি আমার জন্য স্বপ্নের মতো কাজ করেছিল। আমার 1 থেকে 3 টি বৈশিষ্ট্যে গতিশীল বাছাই করা আছে এবং এটি স্বপ্নের মতো কাজ করে। কার্যকর করা সহজ এবং ঝামেলা মুক্ত।
বজঙ্গা

0

তালিকাটি আইনুমেবল বা অযোগ্য হিসাবে রূপান্তর করুন, সিস্টেম.লিংক.ডায়নামিক নেমস্পেসের সাহায্যে যুক্ত করুন, তারপরে আপনি কমা বিচ্ছিন্ন স্ট্রিংয়ে সম্পত্তি নামগুলি অর্ডারবি পদ্ধতিতে উল্লেখ করতে পারেন যা সিস্টেম থেকে ডিফল্টরূপে আসে LIN


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.