none
LINQ динамическая сортировка (GET) RRS feed

  • Вопрос

  • Здравствуйте, помогите с динамической сортировкой на C# LINQ типа:

    Код C#Выделить код
    1
    2
    3
    4
    5
    6
    7
    
    public ActionResult Documents(string sort) // в sort названия свойств
    {
    var query = from md in M1DB.MyDocs
    where md.USERID == @id
     
    orderby md.ID // как бы передать строку sort или типо того?
    select md;

    Сейчас у меня так, но это конечно же тупо:

    public ActionResult Documents(string sort)
            {
                int @id = CurrentUser();
                var query = from md in M1DB.MyDocs
                    where md.USERID == @id
    
                    orderby md.ID
                    select md;
    
    
                //string SortField = "Author";
                if (sort == "ID")
                {
                    query = query.OrderBy(item => item.ID);
                }
                if (sort == "Title")
                {
                    query = query.OrderBy(item => item.Title);
                }
                if (sort == "Author")
                {
                    query = query.OrderBy(item => item.Author);
                }
                if (sort == "DateCreate")
                {
                    query = query.OrderBy(item => item.DateCreate);
                }
                if (sort == "Tegs")
                {
                    query = query.OrderBy(item => item.Tegs);
                }

    • Изменено A1x1On 3 июля 2015 г. 14:32
    3 июля 2015 г. 14:02

Ответы

  • Я так понимаю, что речь идёт о LINQ to SQL. Попробуйте такой код:
    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;
    public static class MyExtensions {
        private static MethodInfo orderBy;
        public static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source,string propertyOrFieldName) {
            ParameterExpression parameter=Expression.Parameter(typeof(TSource));
            MemberExpression propertyOrField=Expression.PropertyOrField(parameter,propertyOrFieldName);
            LambdaExpression lambda=Expression.Lambda(propertyOrField,parameter);
            if(orderBy==null) {
                orderBy=typeof(Queryable).GetMethods(BindingFlags.Static|BindingFlags.Public).Single(mi => mi.Name=="OrderBy"&&mi.GetParameters().Length==2);
            }
            return (IQueryable<TSource>)orderBy.MakeGenericMethod(typeof(TSource),propertyOrField.Type).Invoke(null,new object[] { source,lambda });
        }
    }
    public class MyClass {
        public int Test { get; set; }
        public string Str;
        public override string ToString() {
            return string.Format("{{{0}:{1}}}",Test,Str);
        }
    }
    public static class TestApplication {
        public static void Main() {
            IQueryable<MyClass> data=new MyClass[] {
                new MyClass { Test=1,Str="456" },
                new MyClass { Test=3,Str="123" },
                new MyClass { Test=2,Str="789" }
            }.AsQueryable();
            Array.ForEach(data.OrderBy("Test").ToArray(),Console.WriteLine);
            Console.WriteLine(new string('-',10));
            Array.ForEach(data.OrderBy("Str").ToArray(),Console.WriteLine);
        }
    }
    • Помечено в качестве ответа A1x1On 4 июля 2015 г. 10:20
    3 июля 2015 г. 16:28

Все ответы

  • Здравствуйте, помогите с динамической сортировкой на C# LINQ типа:

    Код C#Выделить код
    1
    2
    3
    4
    5
    6
    7
    
    public ActionResult Documents(string sort) // в sort названия свойств
    {
    var query = from md in M1DB.MyDocs
    where md.USERID == @id
     
    orderby md.ID // как бы передать строку sort или типо того?
    select md;

    Сейчас у меня так, но это конечно же тупо:

    public ActionResult Documents(string sort)
            {
                int @id = CurrentUser();
                var query = from md in M1DB.MyDocs
                    where md.USERID == @id
    
                    orderby md.ID
                    select md;
    
    
                //string SortField = "Author";
                if (sort == "ID")
                {
                    query = query.OrderBy(item => item.ID);
                }
                if (sort == "Title")
                {
                    query = query.OrderBy(item => item.Title);
                }
                if (sort == "Author")
                {
                    query = query.OrderBy(item => item.Author);
                }
                if (sort == "DateCreate")
                {
                    query = query.OrderBy(item => item.DateCreate);
                }
                if (sort == "Tegs")
                {
                    query = query.OrderBy(item => item.Tegs);
                }

    Используйте оператор switch.
    3 июля 2015 г. 16:27
  • Я так понимаю, что речь идёт о LINQ to SQL. Попробуйте такой код:
    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;
    public static class MyExtensions {
        private static MethodInfo orderBy;
        public static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source,string propertyOrFieldName) {
            ParameterExpression parameter=Expression.Parameter(typeof(TSource));
            MemberExpression propertyOrField=Expression.PropertyOrField(parameter,propertyOrFieldName);
            LambdaExpression lambda=Expression.Lambda(propertyOrField,parameter);
            if(orderBy==null) {
                orderBy=typeof(Queryable).GetMethods(BindingFlags.Static|BindingFlags.Public).Single(mi => mi.Name=="OrderBy"&&mi.GetParameters().Length==2);
            }
            return (IQueryable<TSource>)orderBy.MakeGenericMethod(typeof(TSource),propertyOrField.Type).Invoke(null,new object[] { source,lambda });
        }
    }
    public class MyClass {
        public int Test { get; set; }
        public string Str;
        public override string ToString() {
            return string.Format("{{{0}:{1}}}",Test,Str);
        }
    }
    public static class TestApplication {
        public static void Main() {
            IQueryable<MyClass> data=new MyClass[] {
                new MyClass { Test=1,Str="456" },
                new MyClass { Test=3,Str="123" },
                new MyClass { Test=2,Str="789" }
            }.AsQueryable();
            Array.ForEach(data.OrderBy("Test").ToArray(),Console.WriteLine);
            Console.WriteLine(new string('-',10));
            Array.ForEach(data.OrderBy("Str").ToArray(),Console.WriteLine);
        }
    }
    • Помечено в качестве ответа A1x1On 4 июля 2015 г. 10:20
    3 июля 2015 г. 16:28
  • Я так понимаю, что речь идёт о LINQ to SQL. Попробуйте такой код:
    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;
    public static class MyExtensions {
        private static MethodInfo orderBy;
        public static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source,string propertyOrFieldName) {
            ParameterExpression parameter=Expression.Parameter(typeof(TSource));
            MemberExpression propertyOrField=Expression.PropertyOrField(parameter,propertyOrFieldName);
            LambdaExpression lambda=Expression.Lambda(propertyOrField,parameter);
            if(orderBy==null) {
                orderBy=typeof(Queryable).GetMethods(BindingFlags.Static|BindingFlags.Public).Single(mi => mi.Name=="OrderBy"&&mi.GetParameters().Length==2);
            }
            return (IQueryable<TSource>)orderBy.MakeGenericMethod(typeof(TSource),propertyOrField.Type).Invoke(null,new object[] { source,lambda });
        }
    }



    Ругается на неопределенное значение null

    private static MethodInfo orderBy; public static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, string propertyOrFieldName) { ParameterExpression parameter = Expression.Parameter(typeof(TSource)); MemberExpression propertyOrField = Expression.PropertyOrField(parameter, propertyOrFieldName);

    .........

    //propertyOrFieldName == null //Additional information: Значение не может быть неопределенным.

    Мой код:

    .....

    IQueryable<MyDoc> query = from md in M1DB.MyDocs where md.USERID == @id orderby md.ID select md; var l = query.OrderBy(sort).ToList(); return View(l); }




    • Изменено A1x1On 4 июля 2015 г. 7:53
  • А sort в Вашем коде точно не null? Как видите, я передаю propertyOrFieldName никак его не меняя, так что если он равен null, то этот null получен от Вас.
  • А sort в Вашем коде точно не null? Как видите, я передаю propertyOrFieldName никак его не меняя, так что если он равен null, то этот null получен от Вас.
    Да я разобрался , спасибо, ваш код невероятно помог!
    4 июля 2015 г. 10:20