Выполнение приведения в запросе LINQ

Можно ли выполнить приведение в запросе LINQ (ради компилятора)?

Следующий код не так уж страшен, но было бы неплохо сделать его одним запросом:

Content content = dataStore.RootControl as Controls.Content;

List<TabSection> tabList = (from t in content.ChildControls
                            select t).OfType<TabSection>().ToList();

List<Paragraph> paragraphList = (from t in tabList
                                 from p in t.ChildControls
                                 select p).OfType<Paragraph>().ToList();

List<Line> parentLineList = (from p in paragraphList
                             from pl in p.ChildControls
                             select pl).OfType<Line>().ToList();

Код продолжается еще несколькими запросами, но суть в том, что мне нужно создать список из каждого запроса, чтобы компилятор знал, что все объекты в content.ChildControls имеют тип TabSection и все объекты в t.ChildControls относятся к типу Paragraph ... и т. Д., И т. Д.

Есть ли способ в запросе LINQ сообщить компилятору, что t в from t in content.ChildControls является TabSection?

29
задан Sнаđошƒаӽ 17 October 2016 в 06:11
поделиться

5 ответов

Попробуйте это:

from TabSection t in content.ChildControls

кроме того, даже если бы это не было доступно (или для различного, будущего сценария можно встретиться), Вы не были бы ограничены преобразованием всего к Спискам. Преобразование в Список вызывает оценку запроса на месте. Но если бы Вы удаляющий вызов ToList, Вы могли бы работать с типом IEnumerable, который продолжил бы задерживать выполнение запроса, пока Вы на самом деле не выполняете итерации или храните в реальном контейнере.

27
ответ дан Chris Ammerman 17 October 2016 в 06:11
поделиться
  • 1
    @astrocybernaute aspx нужен сервер для создания HTML из него так, необходимо назвать его с помощью сервера и не непосредственно:) – Nenotlep 19 December 2012 в 07:43

В зависимости от того, что Вы пытаетесь сделать, один из них мог бы добиться цели:

List<Line> parentLineList1 =
  (from t in content.ChildControls.OfType<TabSection>()
   from p in t.ChildControls.OfType<Paragraph>()
   from pl in p.ChildControls.OfType<Line>()
   select pl).ToList();

List<Line> parentLineList2 =
  (from TabSection t in content.ChildControls
   from Paragraph p in t.ChildControls
   from Line pl in p.ChildControls
   select pl).ToList();

Примечание, что каждый использует OfType< T> (), который Вы использовали. Это отфильтрует результаты и возвратит только объекты указанного типа. Второй запрос неявно использует Cast< T> (), который бросает результаты в указанный тип. Если какой-либо объект не может быть брошен, исключение выдается. Как упомянуто Бурным Интеллектом, необходимо воздержаться от вызова ToList () максимально долго или стараться избегать его в целом.

10
ответ дан Lucas 17 October 2016 в 06:11
поделиться
  • 1
    Я пытаюсь протестировать Ваше решение, это была бы большая справка для меня, если это работает.. но я хочу преобразовать свой .aspx в PDF не URL, действительно ли это возможно тот же путь? таким образом, я изменил Ваш var с этим: URL var = HttpContext. Текущий. Сервер. MapPath (" ~/wkhtmltopdf/chartImage.aspx"); но это не работало – Armance 1 December 2011 в 17:29

да можно сделать следующее:

List<TabSection> tabList = (from t in content.ChildControls
                            where t as TabSection != null
                            select t as TabSection).ToList();
1
ответ дан Jared 17 October 2016 в 06:11
поделиться
  • 1
    Я не вижу путь, как этот код мог работать над IIS. Вы получите доступ запрещен, потому что учетная запись пользователя IIS по умолчанию не позволит выполнять EXE-файл. – Tomas 14 April 2011 в 12:05
List<TabSection> tabList = (from t in content.ChildControls
                            let ts = t as TabSection
                            where ts != null
                            select ts).ToList();
2
ответ дан Michael Damatov 17 October 2016 в 06:11
поделиться
  • 1
    +1 Очень полезный. Огромное спасибо для регистрации этого кода. Не совсем уверенный Вам нужен WaitForExit () вызов. Запускайте никогда возвраты для меня сразу..., Вы ожидаете на выводе для чтения вслух? – JasonCoder 17 April 2012 в 17:05

И вот форма метода запроса.

List<Line> parentLineList =
  content.ChildControls.OfType<TabSections>()
    .SelectMany(t => t.ChildControls.OfType<Paragraph>())
    .SelectMany(p => p.ChildControls.OfType<Line>())
    .ToList();
1
ответ дан Amy B 17 October 2016 в 06:11
поделиться
  • 1
    ' возвратитесь (код возврата < = 2) ' должен быть ' возвратитесь (код возврата == 0 || код возврата == 2) ' потому что you' ll получают ' 1' если выходной файл уже существует, так проверка перед выполняющимся процессом. – bob 29 May 2010 в 09:59
Другие вопросы по тегам:

Похожие вопросы: