<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Łukasz Sowa &#187; linq</title>
	<atom:link href="http://lukaszsowa.pl/tag/linq/feed/" rel="self" type="application/rss+xml" />
	<link>http://lukaszsowa.pl</link>
	<description>O programowaniu i nie tylko ;)</description>
	<lastBuildDate>Mon, 06 Feb 2012 12:09:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Zapytanie LINQ vs metody LINQ</title>
		<link>http://lukaszsowa.pl/2009/08/zapytanie-linq-vs-metody-linq/</link>
		<comments>http://lukaszsowa.pl/2009/08/zapytanie-linq-vs-metody-linq/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 15:16:00 +0000</pubDate>
		<dc:creator>Łukasz</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[linq]]></category>

		<guid isPermaLink="false">/post/2009/08/26/Zapytanie-LINQ-vs-metody-LINQ.aspx</guid>
		<description><![CDATA[Wszyscy chyba zdają sobie sprawę z tego, jakim dobrodziejstwem jest LINQ, które pojawiło się dosyć dawno, wraz z .NET 3.0 3.5. Jak wiadomo LINQ oferuje trochę nowych słów kluczowych oraz trochę metod &#8211; i tu pojawia się pytanie  &#8211; czym różni się zapis za pomocą słów kluczowych od zapisu &#8222;metodowego&#8221;? Szczególnie interesujące zdaje się być [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Wszyscy chyba zdają sobie sprawę z tego, jakim dobrodziejstwem jest LINQ, które pojawiło się <span style="text-decoration: line-through;">dosyć dawno,</span> wraz z .NET <span style="text-decoration: line-through;">3.0</span> 3.5. Jak wiadomo LINQ oferuje trochę nowych słów kluczowych oraz trochę metod &#8211; i tu pojawia się pytanie  &#8211; czym różni się zapis za pomocą słów kluczowych od zapisu &#8222;metodowego&#8221;? Szczególnie interesujące zdaje się być to, czy któryś z zapisów powoduje jakiś narzut wydajnościowy.</p>
<p style="text-align: justify;">Nie będę budował napięcia i od razu odpowiem &#8211; <strong>query syntax w zasadzie nie różni się niczym od zapisu za pomocą extension methods</strong>. W praktyce, zapytanie zapisane za pomocą słów kluczowych jest tłumaczone podczas procesu kompilacji na coś, co CLR świetnie rozumie &#8211; metody. Microsoft, tak jak wielu programistów, preferuje zapis &#8222;zapytaniowy&#8221; nad &#8222;metodowym&#8221; ze względu na czytelność. Moim zdaniem jest to sprawa mocno dyskusyjna, dla mnie często dużo bardziej czytelniejsze jest używanie extension methods. Ponadto, niestety nie wszystko zapisywalne za pomocą extension methods da się zapisać za pomocą słów kluczowych, ale o tym za moment w przykładach.</p>
<p style="text-align: justify;"><strong>Przykład 1</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> numbers <span style="color: #008000;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">10</span>, <span style="color: #FF0000;">8</span>, <span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">12</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span> numQuery1 <span style="color: #008000;">=</span>
    <span style="color: #0600FF; font-weight: bold;">from</span> num <span style="color: #0600FF; font-weight: bold;">in</span> numbers
    <span style="color: #0600FF; font-weight: bold;">where</span> num <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span>
    orderby num
    <span style="color: #0600FF; font-weight: bold;">select</span> num<span style="color: #008000;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Taki kod równoważny jest (i jednocześnie tłumaczony w procesie kompilacji na następujący):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span> numQuery2 <span style="color: #008000;">=</span> numbers<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>num <span style="color: #008000;">=&gt;</span> num <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">OrderBy</span><span style="color: #008000;">&#40;</span>n <span style="color: #008000;">=&gt;</span> n<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Czy ten drugi nie wydaje się Wam czytelniejszy? ;) Nietrudno jednak stworzyć przykład w którym query syntax będzie bardziej wymowne.</p>
<p style="text-align: justify;"><strong>Przykład 2</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">var personQuery1 <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">from</span> person <span style="color: #0600FF; font-weight: bold;">in</span> people
                   let fullname <span style="color: #008000;">=</span> person<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; &quot;</span> <span style="color: #008000;">+</span> person<span style="color: #008000;">.</span><span style="color: #0000FF;">Surname</span>
                   <span style="color: #0600FF; font-weight: bold;">select</span> <span style="color: #008000;">new</span> <span style="color: #008000;">&#123;</span> Name <span style="color: #008000;">=</span> fullname, Age <span style="color: #008000;">=</span> person<span style="color: #008000;">.</span><span style="color: #0000FF;">Age</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
var personQuery2 <span style="color: #008000;">=</span> people
                   <span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Select</span><span style="color: #008000;">&#40;</span>person <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> <span style="color: #008000;">&#123;</span> Name <span style="color: #008000;">=</span> person<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; &quot;</span> <span style="color: #008000;">+</span> person<span style="color: #008000;">.</span><span style="color: #0000FF;">Surname</span>, Age <span style="color: #008000;">=</span> person<span style="color: #008000;">.</span><span style="color: #0000FF;">Age</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">W pierwszej linijce widzimy jak przydatne (dla czytelności) jest słowo kluczowe let pozwalające na tymczasową definicję nowej zmiennej (więcej o słówku let <a href="http://www.maciejaniserowicz.com/post/2008/07/07/let-explained.aspx">tu</a> i <a href="http://www.maciejaniserowicz.com/post/2008/07/13/let-revisited.aspx">tu</a> na blogu <a href="http://www.maciejaniserowicz.com/">Maćka Aniserowicza</a>). Zapis za pomocą extension methods nie jest już taki ładny (choć to też zapewne sprawa gustu). Ostatni przykład zaprezentuje nam, że nie wszystko da się zrobić za pomocą query syntax.</p>
<p style="text-align: justify;"><strong>Przykład 3</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> numbers <span style="color: #008000;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">10</span>, <span style="color: #FF0000;">8</span>, <span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">12</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
var nums <span style="color: #008000;">=</span> numbers<span style="color: #008000;">.</span><span style="color: #0000FF;">Skip</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Take</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToList</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Efektu wywołania takich metod nie otrzyma się za pomocą zapytania.</p>
<h2 style="text-align: justify;">Podsumowanie</h2>
<p style="text-align: justify;">Wszystko co da się napisać za pomocą query syntax da się zapisać za pomocą extension methods. Odwrotnie już tak niestety nie jest. Często zapis za pomocą słów kluczowych jest dużo czytelniejszy (szczególnie przy używaniu let, group, join), natomiast metody dają nam szersze możliwości. Wybór więc powinien zależeć od osobistego stylu i zdania na temat tego, co jest bardziej wymownie. Nieważne jednak czy korzystasz z metod, czy z zapytań, powinieneś robić to świadomie, aby nie tracić na wydajności &#8211; polecam przeczytać drugi z linków do blogu Maćka powyżej.</p>
]]></content:encoded>
			<wfw:commentRss>http://lukaszsowa.pl/2009/08/zapytanie-linq-vs-metody-linq/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

