Подлипенский Павел

Блог о технологиях и деньгах

Небольшой LINQ пазл

clock февраля 11, 2009 10:25 by author Подлипенский Павел

 

Почему следующий кусок кода генерирует StackOverflowException?

IEnumerable<int> q = new int[] { 1, 2 };
q = from x in new int[] { 1, 2 }
    from y in q
    select x + y;
q.ToArray();

С предложениями, как это исправить - прошу в комментарии ;)

Текущий рейтинг: 5.0 (5 голосов)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Скаженi кабани: LINQ to XML против LINQ to XML с использованием XPath

clock декабря 5, 2008 12:47 by author Подлипенский Павел

Как вы обрабатываете свои XML-данные? С помощью LINQ to XML, XPath, XmlDocument или же сами парсите (тогда вам пора в больничку). Лично я предпочитаю писать XPath-выражение, потому что они (относительно) просты в написании и, соответственно, в чтении. Да и скорость обработки этих выражений всегда радовала своей производительностью. Какое-то время назад вышел extension для LINQ to XML, позволяющий использовать XPath выражения.

Небольшой эксперимент позволил определить плюсы и минусы нового расширения по сравнению с LINQ to XML. Для начала я спер базу AdventureWorks и экспортировал данные из таблицы SalesOrderDetail в xml файлик. 120000 строк мне показались достаточным набором данных для подобного теста.

Затем я написал три различных запроса к этому набору данных с использованием LINQ to XML и тожесамое + XPath. Код и результаты тестов прилагаются.

LINQ to XML: 246.96 мс

/// <summary>
/// Выбираем все элементы для ордера с ID=46348
/// </summary>
public static int RunQuery1(XDocument xDoc)
{
IEnumerable<XElement> elements =
from result in xDoc.Descendants("dataroot").Descendants("SalesOrderDetail")
where result.Element("SalesOrderID").Value == "46348"
select result;
return elements.Count();
}

 

LINQ to XML с XPath: 1025.95 мс

public static int RunQuery1(XDocument xDoc)
{
return xDoc.XPathSelectElements("//dataroot/SalesOrderDetail[SalesOrderID=46348]").Count();
}

Правда код с использованием XPath выглядит элегантнее? ОК, идем дальше.

LINQ to XML: 208.88 мс

/// <summary>
/// Считаем все SalesOrderDetailы частота заказов > 2 для ProductID=761
/// </summary>
public static int RunQuery2(XDocument xDoc)
{
IEnumerable<XElement> elements =
from result in xDoc.Descendants("dataroot").Descendants("SalesOrderDetail")
where String.CompareOrdinal(result.Element("OrderQty").Value, "2") > 0
&& result.Element("ProductID").Value == "761"
select result;
return elements.Count();
}

 

LINQ to XML сXPath: 1013.19 мс

public static int RunQuery2(XDocument xDoc)
{
return xDoc.XPathSelectElements("//dataroot/SalesOrderDetail[OrderQty>2 and ProductID=761]").Count();
} 

 

LINQ to XML: 218.37 мс

/// <summary>
/// Считаем все SalesOrderDetailы, где LineTotal > $4000
/// </summary>
public static int RunQuery3(XDocument xDoc)
{
IEnumerable<XElement> elements =
from result in xDoc.Descendants("dataroot").Descendants("SalesOrderDetail")
where String.CompareOrdinal(result.Element("LineTotal").Value, "4000.00") > 0
select result;
return elements.Count();
}

LINQ to XML с XPath: 944.9 мс

public static int RunQuery3(XDocument xDoc)
{
return xDoc.XPathSelectElements("//dataroot/SalesOrderDetail[LineTotal>4000.00]").Count();
}

Для наглядности нанесем эти данные на график

image

Теперь всем видно, что LINQ to XML куда быстрее, чем тоже самое но с использованием XPath. Зачем же Майкрософт написало такую надстройку?

XPath удобнее использовать, когда

  • код должен быть читабельным
  • при миграции продуктов, использующих XPath исторически
  • когда приложение не требует большой производительности от доступа к данным. Мой набор данных имел 120000 строк и при этом XPath работал на 1 секунду медленнее, чем LINQ to XML. Не так уж и плохо, верно?

Но лучше от XPath отказаться, если

  • производительность делает вам погоду
  • вам необходим sql-похожий синтаксис (ну мало ли, может вы sql-маньяк)
  • вам необходима группировка (к примеру, посчитать сумму ордера)
  • вам небоходим функционал агрегирования (суммы, среднее и прочее)

Вообщем на те вам, и выбирайте что хотите.

Текущий рейтинг: 5.0 (5 голосов)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Search


LinkedIn Profile

Tags

Posts

  • Pingback from 241.akemet.com Cb300 Second Hand Address, Cb3000 Video Price Marine Engines
    241.akemet.com

  • http://tvsh2004.narod.ru/gm03.html
    test

  • конечно это очень дорого, у нас ведь вся страна пользуется только лицензионной windows...
    Славян

  • Алексей: С удовольствием!
    Подлипенский Павел

  • Присоединяйтесь к ЖЖ-коммьюнити http://community.livejournal.com/ua_extjs
    Алексей

  • Поправка насчет генерации самого хтмл-кода для ответа веб метода. Предлагаю сделать проще, не создавая объекта страницы и без тега <form> [WebMethod] public string GetControlHTML(string controlLocation) { HtmlTextWriter tw = new HtmlTextWriter(new StringWriter()); var uc = (UserControl)(new UserControl()).LoadControl(controlLocation); uc.RenderControl(tw); return tw.InnerWriter.ToString(); }
    Anthony

Categories

Calendar

<<  Сентябрь 2010  >>
воповтсрчепясу
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Archive

© Copyright 2010

Sign in

Ó÷àñòíèê ïëàíåòû Developers.org.ua

Bookmark and Share

Web Developement Blogs - Blog Catalog Blog Directory