753 Stimmen

Dynamisches LINQ OrderBy auf IEnumerable<T> / IQueryable<T>

Ich habe ein Beispiel in der VS2008 Beispiele für Dynamic LINQ, mit dem Sie eine SQL-ähnliche Zeichenfolge verwenden können (z. B. OrderBy("Name, Age DESC")) für die Bestellung. Leider funktioniert die enthaltene Methode nur bei IQueryable<T> . Gibt es eine Möglichkeit, diese Funktionalität auf IEnumerable<T> ?

3voto

Mike Christiansen Punkte 1050

Eine alternative Lösung verwendet die folgende Klasse/Schnittstelle. Sie ist nicht wirklich dynamisch, aber sie funktioniert.

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;
    }
}

1voto

Francis Shaw Punkte 71

Sie können dies für mehrere Bestellungen so machen

IOrderedEnumerable<JToken> sort;

if (query.OrderBys[0].IsDESC)
{
    sort = jarry.OrderByDescending(r => (string)r[query.OrderBys[0].Key]);
}
else
{
    sort = jarry.OrderBy(r =>
        (string) r[query.OrderBys[0].Key]); 
}

foreach (var item in query.OrderBys.Skip(1))
{
    if (item.IsDESC)
    {
        sort = sort.ThenByDescending(r => (string)r[item.Key]);
    }
    else
    {
        sort = sort.ThenBy(r => (string)r[item.Key]);
    }
}

0voto

user145610 Punkte 2751

Konvertieren Sie Liste in IEnumerable oder Iquerable, fügen Sie mit System.LINQ.Dynamic Namespace, dann u können die Eigenschaftsnamen in Komma getrennte Zeichenfolge zu OrderBy Methode, die standardmäßig von System.LINQ.Dynamic kommt erwähnen.

-1voto

BenW Punkte 1205

Ich kann dies mit dem unten stehenden Code erreichen. Sie müssen keinen langen und komplexen Code schreiben.

 protected void sort_array(string field_name, string asc_desc)
        {

            objArrayList= Sort(objArrayList, field_name, asc_desc);
        }

        protected List<ArrayType> Sort(List<ArrayType> input, string property, string asc_desc)
        {
            if (asc_desc == "ASC")
            {

                return input.OrderBy(p => p.GetType()
                                           .GetProperty(property)
                                           .GetValue(p, null)).ToList();
            }
            else
            {
                return input.OrderByDescending(p => p.GetType()
                                               .GetProperty(property)
                                               .GetValue(p, null)).ToList();
            }
        }

-3voto

Arindam Punkte 178
var result1 = lst.OrderBy(a=>a.Name);// for ascending order. 
 var result1 = lst.OrderByDescending(a=>a.Name);// for desc order.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X