Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Linq и родительский класс

29K
15 января 2010 года
Daniel Lavrushin
30 / / 26.10.2008
Здравствуйте,

у меня немного опыта работы с Linq, по этому прошу вашей помощи.

Есть родительский класс VelObject, от него в программе наследуются все остальные используемые объекты (например записи календаря VelPlan).

Задача заключается в том, чтобы в методе класса коллекции VelPlans отсортировать объекты VelPlan по свойству VelPlan.StartDate (по времени короче).

 
Код:
var query =
       from pl in this.Collection
      orderby  pl.StartDate descending
       select pl;

где Collection - собственно свойство родительского класса List<VelObject>.

Естественно, что в VelObject нет свойства StartDate.

Соответственно вопрос, как использовать linq в наследуемых объектах?

Я нашел только вариант
 
Код:
var query =
       from pl in this.Collection.OfType<VelPlan>()
      orderby  pl.StartDate descending
       select pl;

но в итоге возвращается 0, хотя до этого коллекция полна. Помогите, пжаласта.
1.9K
15 января 2010 года
GreenRiver
451 / / 20.07.2008
Это нужно?
 
Код:
List<object> Collection = new List<object>()
            {
                new Plan() { Time = new DateTime(2009, 03, 01) },
                new Plan() { Time = new DateTime(2009, 01, 01) },
                new Plan() { Time = new DateTime(2009, 04, 01) }
            };

            var query = from i in Collection
                        orderby ((Plan)i).Time
                        select i;

P.S. как-то черезчур сурово для сортировки LinQ использовать...
5
15 января 2010 года
hardcase
4.5K / / 09.08.2005
Странно, что возникли проблемы с OfType.
Такой код вполне работает:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication38 {

    public class VelObject {
    }

    public class VelOther : VelObject {
    }

    public class VelPlan : VelObject {

        public DateTime StartDate {
            get;
            set;
        }
    }

    public class VelPlanAncestor : VelPlan {

    }

    class Program {
        static void Main(string[] args) {
            var c1 = new List<VelObject>(new VelObject[] {
                new VelPlanAncestor { StartDate = new DateTime(2010, 3, 7) },
                new VelObject(),
                new VelPlan() { StartDate = new DateTime(2010, 2, 7) },
                new VelPlan() { StartDate = new DateTime(2010, 6, 1) },
                new VelPlan() { StartDate = new DateTime(2010, 1, 2) },
                new VelPlan() { StartDate = new DateTime(2010, 1, 1) }
            });

            var c2 = new List<VelPlan>(c1.OfType<VelPlan>());
            c2.Sort((a, b) => Comparer<DateTime>.Default.Compare(b.StartDate, a.StartDate));

            var c3 = (from p in c1.OfType<VelPlan>()
                      orderby p.StartDate descending
                      select p).ToList();

            var c4 = c1.OfType<VelPlan>()
                .OrderByDescending(p => p.StartDate)
                .ToList();
        }
    }
}
29K
15 января 2010 года
Daniel Lavrushin
30 / / 26.10.2008
hardcase, спасибо. Действительно, оказалось, что дело было совсем не в нем, и запрос я писал правильно.

Оказалось, что коллекция обнулялась не в нужном месте, а я этот момент упустил.
5
15 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Daniel Lavrushin
hardcase, спасибо. Действительно, оказалось, что дело было совсем не в нем, и запрос я писал правильно.

Старайтесь по возможности избегать LINQ, хотя он и позволяет выполнять реляционные операции над объектами в памяти (не спорю, есть ситуации когда это позволяет существенно минимизировать код), он нацелен на работу с БД, и "запросы в памяти" могут нанести серьезный удар по производительности.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог