Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > IEnumerable ReturnData(IEnumerable data)


Автор: Gregoryy 8.3.2009, 02:11
Есть метод
Код

public IEnumerable ReturnData(IEnumerable data)
{
}

Пытаюсь передать эму результат такого запроса
Код

var getNews = from news in News.Systems_News
                      where news.Publish_Date <= DateTime.Now.ToLocalTime()
                      orderby news.Publish_Date descending
                      select new
                      {
                          news.Id,
                          news.Title,
                          news.Home_Text,
                          news.Publish_Date,
                          news.Author,
                          news.Comment_Count,
                          news.View_Count,
                          summ = GetSumm(news.Vote_User_Count,
                              news.Vote_Count)
                      };

Чтобы в этом методе выполнить с data еще пару манипуляций типа 
Код

Skip(x * y).Take(x).ToList()

Значения х и у будет браться из свойств класса где реализован метод.
Вот только не могу понять правильно ли я реализовал метод. Если да, тогда как привести в тип чтобы можно было выполнить такие манипуляции? Результат выполнения метода хочу вернуть в ListView.DataSource

Автор: Любитель 10.3.2009, 02:16
1. Твой запрос нескомпилится. А именно - ты создаёшь анонимный тип без именования пропертей (кроме суммы). Так нельзя smile
2. Большинство экстеншен-методов от Enumerable применимы только к дженерик-версии IEnumerable. Проблма в том, что для анонимного типа ты не сможешь объявить сигнатуру дженерик-версии IEnumerable.

Потому - создай свой тип, возвращай IEnumerable<MyType>. И разберись с инициализацией пропертей при вызове конструктора (с использованием синтаксиса C# 3.0).

Ещё такой момент - ты уверен, что тебе всегда нужна эта сумма? Может проще вернуть просто твой news (тогда тип для IEnumerable уже будет готов)? А, если понадобятся, посчитать суммы.

Автор: PashaPash 10.3.2009, 19:38
Цитата(Любитель @  10.3.2009,  02:16 Найти цитируемый пост)
А именно - ты создаёшь анонимный тип без именования пропертей (кроме суммы). Так нельзя 

Вообще-то так можно.
Gregoryy, 
передавай IEnumerable, только внутри делай data.Cast<object>().Skip(x * y).Take(x)... Возможны глюки с определенными провайдерами, но в общем должно работать.

Автор: Gregoryy 10.3.2009, 22:42
Любитель, запрос работает нормально. Данные выводятся. 
PashaPash, Не совсем понял что ты имеешь виду внутри? 
Дело в том что когда я передаю данные в метод, который принимает и возвращает IEnumerable, я не могу с ними нечего сделать. Если точно сказать data не имеет методы фильтрации. Я приводил в тип List<IEnumerable> вроде фильтрация активировалась. Но свойства отсутствуют или данные просто пустые. Я уже по разному пробовал. Но так и не понял как правильно сделать.
Например если сделать так:
Код

public IEnumerable ReturnData(IEnumerable data)
        {
            List<IEnumerable> l = (data as List<IEnumerable>);
            return l.Skip(0 * 10).Take(10).ToList();
        }

Цитата

То выводиться ошибка:
Сведения об исключении: System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: source

Если вот так:
Код

public IEnumerable ReturnData(IEnumerable data)
        {
            List<IEnumerable> l = new List<IEnumerable> { data};
            return l.Skip(0 * 10).Take(10).ToList();
        }

Цитата

Сведения об исключении: System.Web.HttpException: DataBinding: 'System.Data.Linq.DataQuery`1[[<>f__AnonymousType0`8[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], App_Web_ce9whdda, Version=0.0...' не содержит свойство с именем Title. 

Автор: Любитель 11.3.2009, 00:01
Цитата(PashaPash @  10.3.2009,  19:38 Найти цитируемый пост)
Вообще-то так можно.

О, позор мне! Блин, не знал  smile 

Gregoryy, Skip, Take и прочие действительно (как правильно сказал PashaPash) можно заставить работать, вернув IEnumerable<object>. Для получения последнего используется экстеншен-метод Cast. Но пройти по пропертям всё равно не получится. Более того, после такой манипуляции (возвращения анонимного типа) с пропертями можно будет работать только через рефлекшен. Что вряд ли удобно smile

Автор: PashaPash 11.3.2009, 11:58
Gregoryy, List<IEnumerable> - это жестоко. Попробуй что-то типа:
Код

public IEnumerable ReturnData(IEnumerable data)
        {
            return data.Cast<object>().Skip(0 * 10).Take(10);
        }

Цитата(Любитель @  11.3.2009,  00:01 Найти цитируемый пост)
Но пройти по пропертям всё равно не получится.

судя по всему, тут нужно что-то типа pager-а, ему не нужны проперти. а результат отдается ListView, тот тоже не требует строгой типизации.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)