سؤال

وأنا محاولة إنشاء شجرة التعبير الذي يدعو في نهاية المطاف سلسلة من أساليب GroupBy على نوع Enumerable.

في شكل مبسط أحاول شيئا من هذا القبيل:

IEnumerable<Data> list = new List<Data>{new Data{Name = "A", Age=10},
   new Data{Name = "A", Age=12},
   new Data{Name = "B", Age=20},
   new Data{Name="C", Age=15}};

Expression data = Expression.Parameter(typeof(IEnumerable<Data>), "data");
Expression arg = Expression.Parameter(typeof(Data), "arg");
Expression nameProperty = Expression.PropertyOrField(arg, "Name");

Expression group = Expression.Call(typeof(Enumerable), "GroupBy", new Type[] { typeof(Data), typeof(string) }, data, nameProperty);

والدعوة إلى Expression.Call في نهاية يلقي "لا طريقة" GroupBy "على نوع 'System.Linq.Enumerable" متوافق مع الحجج المقدمة. "

وأنا أفعل شيئا مماثلا، بطريقة مماثلة مع Enumerable.OrderBy بنجاح، وأنا الحيرة.

وهو محل تقدير أي مساعدة.

هل كانت مفيدة؟

المحلول

هل لا تحتاج إلى تمرير امدا في مثل النوع الثاني؟ مثل ذلك.

    public void Test()
    {
        IEnumerable<Data> list = new List<Data>
        {
            new Data{Name = "A", Age=10},
            new Data{Name = "A", Age=12},
            new Data{Name = "B", Age=20},
            new Data{Name= "C", Age=15}
        };


        var data = Expression.Parameter(typeof(IEnumerable<Data>), "data");
        var arg = Expression.Parameter(typeof(Data), "arg");
        var nameProperty = Expression.PropertyOrField(arg, "Name");
        var lambda = Expression.Lambda<Func<Data, string>>(nameProperty, arg);

        var expression = Expression.Call(
            typeof(Enumerable),
            "GroupBy", 
            new Type[] { typeof(Data), typeof(string) },
            data,
            lambda);

        //expected = {data.GroupBy(arg => arg.Name)}
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top