<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Georgi Ganchev's C# / NET Framework Blog</title>
	<atom:link href="http://georgiganchev.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://georgiganchev.wordpress.com</link>
	<description>C# / NET Framework programming</description>
	<lastBuildDate>Thu, 18 Jun 2009 18:02:27 +0000</lastBuildDate>
	<language>bg</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='georgiganchev.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Georgi Ganchev's C# / NET Framework Blog</title>
		<link>http://georgiganchev.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://georgiganchev.wordpress.com/osd.xml" title="Georgi Ganchev&#039;s C# / NET Framework Blog" />
	<atom:link rel='hub' href='http://georgiganchev.wordpress.com/?pushpress=hub'/>
		<item>
		<title>boykostov.info &#8211; може ли да сте такива тъпаци ?</title>
		<link>http://georgiganchev.wordpress.com/2009/06/18/boykostov-info-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/</link>
		<comments>http://georgiganchev.wordpress.com/2009/06/18/boykostov-info-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:02:27 +0000</pubDate>
		<dc:creator>georgiganchev</dc:creator>
				<category><![CDATA[Програмиране C# / NET Framework]]></category>
		<category><![CDATA[boykostov.info]]></category>
		<category><![CDATA[олигофрени]]></category>
		<category><![CDATA[социалисти]]></category>
		<category><![CDATA[тъпаци]]></category>

		<guid isPermaLink="false">http://georgiganchev.wordpress.com/2009/06/18/boykostov-info-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/</guid>
		<description><![CDATA[Тези са наистина олигофренчета &#8211; може би защото са социалисти ? Изчезна boykostov.org появи се boykostov.info<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=47&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Тези са наистина олигофренчета &#8211; може би защото са социалисти ? Изчезна boykostov.org появи се boykostov.info</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/georgiganchev.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/georgiganchev.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/georgiganchev.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/georgiganchev.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/georgiganchev.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/georgiganchev.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/georgiganchev.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/georgiganchev.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/georgiganchev.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/georgiganchev.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/georgiganchev.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/georgiganchev.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/georgiganchev.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/georgiganchev.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=47&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://georgiganchev.wordpress.com/2009/06/18/boykostov-info-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/baf1ba432a238a76d1d7de6dcc79ef2f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">georgiganchev</media:title>
		</media:content>
	</item>
		<item>
		<title>boykostov.org вече го няма</title>
		<link>http://georgiganchev.wordpress.com/2009/06/08/boykostov-org-%d0%b2%d0%b5%d1%87%d0%b5-%d0%b3%d0%be-%d0%bd%d1%8f%d0%bc%d0%b0/</link>
		<comments>http://georgiganchev.wordpress.com/2009/06/08/boykostov-org-%d0%b2%d0%b5%d1%87%d0%b5-%d0%b3%d0%be-%d0%bd%d1%8f%d0%bc%d0%b0/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 08:43:27 +0000</pubDate>
		<dc:creator>georgiganchev</dc:creator>
				<category><![CDATA[Програмиране C# / NET Framework]]></category>
		<category><![CDATA[boykostov.org вече го няма]]></category>

		<guid isPermaLink="false">http://georgiganchev.wordpress.com/2009/06/08/boykostov-org-%d0%b2%d0%b5%d1%87%d0%b5-%d0%b3%d0%be-%d0%bd%d1%8f%d0%bc%d0%b0/</guid>
		<description><![CDATA[DNS-ите не го resolve. Няма ги Google рекламите. Изхарчиха ни парите. Манафи. Очакваме ново &#8222;включване&#8220; преди парламентарните&#8230;<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=46&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>DNS-ите не го resolve. Няма ги Google рекламите. Изхарчиха ни парите. Манафи. Очакваме ново &#8222;включване&#8220; преди парламентарните&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/georgiganchev.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/georgiganchev.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/georgiganchev.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/georgiganchev.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/georgiganchev.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/georgiganchev.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/georgiganchev.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/georgiganchev.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/georgiganchev.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/georgiganchev.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/georgiganchev.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/georgiganchev.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/georgiganchev.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/georgiganchev.wordpress.com/46/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=46&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://georgiganchev.wordpress.com/2009/06/08/boykostov-org-%d0%b2%d0%b5%d1%87%d0%b5-%d0%b3%d0%be-%d0%bd%d1%8f%d0%bc%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/baf1ba432a238a76d1d7de6dcc79ef2f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">georgiganchev</media:title>
		</media:content>
	</item>
		<item>
		<title>boykostov.org &#8211; може ли да сте такива тъпаци ?</title>
		<link>http://georgiganchev.wordpress.com/2009/05/25/boykostov-org-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/</link>
		<comments>http://georgiganchev.wordpress.com/2009/05/25/boykostov-org-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/#comments</comments>
		<pubDate>Mon, 25 May 2009 17:25:58 +0000</pubDate>
		<dc:creator>georgiganchev</dc:creator>
				<category><![CDATA[Програмиране C# / NET Framework]]></category>
		<category><![CDATA[boykostov]]></category>
		<category><![CDATA[boykostov.org]]></category>
		<category><![CDATA[boykostov.org - боклуци]]></category>
		<category><![CDATA[boykostov.org - свине]]></category>
		<category><![CDATA[boykostov.org - червени свине]]></category>
		<category><![CDATA[boykostov.org лайняри]]></category>
		<category><![CDATA[boykostov.org манафи]]></category>
		<category><![CDATA[boykostov.org педали]]></category>
		<category><![CDATA[boykostov.org тъпаци]]></category>
		<category><![CDATA[лайнярите boykostov.org]]></category>
		<category><![CDATA[манафите boykostov.org]]></category>
		<category><![CDATA[педалите boykostov.org]]></category>
		<category><![CDATA[hack boykostov]]></category>
		<category><![CDATA[hack boykostov.org]]></category>
		<category><![CDATA[тъпаците boykostov.org]]></category>

		<guid isPermaLink="false">http://georgiganchev.wordpress.com/2009/05/25/boykostov-org-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/</guid>
		<description><![CDATA[Всички знаете за тъповатия сайт boykostov.org, който го изнесоха и по реклами в телевизиите. Много са ми тъпи тея БСП боклуци, драпащи с подобни смехотворни методи да останат на власт. Знайте, че всичко това е платено с моите и вашите данъци &#8211; тоест, правителството използва нашия труд срещу нас самите. Надявам се никой от вас [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=34&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Всички знаете за тъповатия сайт boykostov.org, който го изнесоха и по реклами в телевизиите. Много са ми тъпи тея БСП боклуци, драпащи с подобни смехотворни методи да останат на власт. Знайте, че всичко това е платено с моите и вашите данъци &#8211; тоест, правителството използва нашия труд срещу нас самите. Надявам се никой от вас не си е помислил, че зад всичко това стои сдружението на ентусиасти, нарекло се с глуповатото име &#8222;Нова Зора&#8220;, напомнящо ми на &#8222;Пета Младост&#8220; или по-скоро &#8222;Живот след Смъртта&#8220;. Супер много ме подразни мен, а сигурно и вас, всичките тея лайна, които очевадно са създадени от боклуците и резаците от БСП/ДПС (както обикновено) и всякакви подлоги, които гравитират около тях.</p>
<p>Ако имате желание да се опитаме да &#8222;натоварим&#8220; сайта, прочетете следващите 2-3 изречения.</p>
<p>Написах набързо една програмка, която ще изтегли неограничено много пъти техния &#8222;плакат&#8220;, който те самите са сложили на сайта boykostov.org за теглене. Ако се съберем достатъчно хора (и особено ако теглим по едно и също време) е възможно да стане някакво &#8222;прецакване&#8220;. За последните 3 дена теглене от моя страна (сам), веднъж успях да &#8222;постигна&#8220; &#8222;500 Server Error&#8220; за няколко минути (проверихме &#8211; даваше го и на други хора), след което ме баннаха. Разбира се &#8211; едно рестартиране на БТК рутера ми ми даде нов ИП адрес <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ако имате други идеи, моля споделете ги. Програмката може да изтеглите от:</p>
<p><a href="http://compclub2.hit.bg/HttpResourceSucker.zip">http://compclub2.hit.bg/HttpResourceSucker.zip</a></p>
<p>Изисква .NET Framework 2.0 &#8211; само декомпресирайте в която и да е директория и стартирайте файла HttpResourceSucker.exe</p>
<p>За ентусиастите &#8211; от тук можете да изтеглите сорс кода:</p>
<p><a href="http://compclub2.hit.bg/HttpResourceSucker_Source.zip">http://compclub2.hit.bg/HttpResourceSucker_Source.zip</a></p>
<p>А ето как изглежда програмата:</p>
<p><img src="http://compclub2.hit.bg/HttpResourceSucker.gif" alt="" /></p>
<p>Ето и още една ценна програмка. Написах я също така набързичко. Идеята й е, че с нея много бързо ще ви бъдете баннати и няма да можете вече да отваряте boykostov.org. Хубавата новина е, че ако има и други хора с вашия ИП адрес, и те няма да могат да посещават адреса &#8211; в крайна сметка това е целта &#8211; да не ходят хората на него <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Програмката е &#8222;конзолна&#8220; &#8211; ще се стартира в &#8222;черен екран&#8220; &#8211; стартирайте я и натиснете който и да е клавиш за да започне. Трябва да видите множество &#8222;500 Internal Server Error&#8220;. А когато ви баннат ИП адреса, ще видите нещо като &#8220; Ето ги и линковете:</p>
<p><a href="http://compclub2.hit.bg/SendMailUsingBoykostov.zip">http://compclub2.hit.bg/SendMailUsingBoykostov.zip</a></p>
<p>А това е сорс кода:</p>
<p><a href="http://compclub2.hit.bg/SendMailUsingBoykostov_Source.zip">http://compclub2.hit.bg/SendMailUsingBoykostov_Source.zip</a></p>
<p>Ето как изглежда програмката:</p>
<p><img src="http://compclub2.hit.bg/InternalServerError.gif" alt="http://compclub2.hit.bg/InternalServerError.gif" /></p>
<p>Ако получите множество редове с надписи от рода на &#8222;ID 14 crashed in ConnectCallback with System.Net.Sockets.SocketException:&#8220;, значи най-вероятно сте баннати (както и всички, които са с вашия ИП адрес).</p>
<p><img src="http://compclub2.hit.bg/serGEI.jpg" alt="http://compclub2.hit.bg/serGEI.jpg" /><br />
Остави детето на мира ве, серГЕЙ шибан, не виждаш ли че го разплакваш ?<br />
Вече е 10 часа вечерта &#8211; а ти знаеш ли къде е Елена Йончева ???????</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/georgiganchev.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/georgiganchev.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/georgiganchev.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/georgiganchev.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/georgiganchev.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/georgiganchev.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/georgiganchev.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/georgiganchev.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/georgiganchev.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/georgiganchev.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/georgiganchev.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/georgiganchev.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/georgiganchev.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/georgiganchev.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=34&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://georgiganchev.wordpress.com/2009/05/25/boykostov-org-%d0%bc%d0%be%d0%b6%d0%b5-%d0%bb%d0%b8-%d0%b4%d0%b0-%d1%81%d1%82%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8%d0%b2%d0%b0-%d1%82%d1%8a%d0%bf%d0%b0%d1%86%d0%b8/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/baf1ba432a238a76d1d7de6dcc79ef2f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">georgiganchev</media:title>
		</media:content>

		<media:content url="http://compclub2.hit.bg/HttpResourceSucker.gif" medium="image" />

		<media:content url="http://compclub2.hit.bg/InternalServerError.gif" medium="image">
			<media:title type="html">http://compclub2.hit.bg/InternalServerError.gif</media:title>
		</media:content>

		<media:content url="http://compclub2.hit.bg/serGEI.jpg" medium="image">
			<media:title type="html">http://compclub2.hit.bg/serGEI.jpg</media:title>
		</media:content>
	</item>
		<item>
		<title>Distinct</title>
		<link>http://georgiganchev.wordpress.com/2009/03/01/21/</link>
		<comments>http://georgiganchev.wordpress.com/2009/03/01/21/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 18:47:24 +0000</pubDate>
		<dc:creator>georgiganchev</dc:creator>
				<category><![CDATA[Програмиране C# / NET Framework]]></category>
		<category><![CDATA[Distinct]]></category>

		<guid isPermaLink="false">http://georgiganchev.wordpress.com/?p=21</guid>
		<description><![CDATA[Ако някога ви се наложи да извлечете Distinct инстанции от IEnumerable по определено свойство, ще бъдете малко неприятно изненадани, след като разгледате готовия Distinct метод. Поне на мен ми изглежда доста ограничен и почти неизползваем в реални ситуации &#8211; прави Distinct само на еднакви инстанции, а не на еднакво съдържание на инстанциите &#8211; тоест ще [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=21&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ако някога ви се наложи да извлечете Distinct инстанции от IEnumerable по определено свойство, ще бъдете малко неприятно изненадани, след като разгледате готовия Distinct метод. Поне на мен ми изглежда доста ограничен и почти неизползваем в реални ситуации &#8211; прави Distinct само на еднакви инстанции, а не на еднакво съдържание на инстанциите &#8211; тоест ще &#8222;заработи&#8220; само ако в IEnumerable вкарате два или повече пъти една и съща инстанция. Този overload на Distinct (без параметри) изобщо няма да го разглеждаме. Ето как бихте могли да го използвате със собствен компаратор (overload на Distinct, който приема един параметър от тип IEqualityComparer):</p>
<p>За да вземете сорс кода правилно &#8211; Copy/Paste го в Wordpad, и после от там Copy/Paste във VS.</p>
<p></p>
<blockquote>
<div style="font-family:Courier New;font-size:10pt;color:black;background:white;">
<pre style="margin:0;"><span style="color:blue;">class</span> <span style="color:#2b91af;">Program</span></pre>
<pre style="margin:0;">{</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; <span style="color:blue;">static</span> <span style="color:blue;">void</span> Main(<span style="color:blue;">string</span>[] args)</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; {</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:green;">// &#1055;&#1098;&#1083;&#1085;&#1080;&#1084; &#1089;&#1080; IEnumerable &#1089; &#1085;&#1103;&#1082;&#1086;&#1083;&#1082;&#1086; &#1080;&#1085;&#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1080;</span></pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:#2b91af;">List</span>&lt;<span style="color:#2b91af;">SimpleClass</span>&gt; list = <span style="color:blue;">new</span> <span style="color:#2b91af;">List</span>&lt;<span style="color:#2b91af;">SimpleClass</span>&gt;</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">new</span> <span style="color:#2b91af;">SimpleClass</span> {ID = 1, Name = <span style="color:#a31515;">&quot;FirstX&quot;</span>, Email = <span style="color:#a31515;">&quot;my1@email.com&quot;</span>},</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">new</span> <span style="color:#2b91af;">SimpleClass</span> {ID = 2, Name = <span style="color:#a31515;">&quot;Second&quot;</span>, Email = <span style="color:#a31515;">&quot;my2@email.com&quot;</span>},</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">new</span> <span style="color:#2b91af;">SimpleClass</span> {ID = 3, Name = <span style="color:#a31515;">&quot;Second&quot;</span>, Email = <span style="color:#a31515;">&quot;my3@email.com&quot;</span>},</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">new</span> <span style="color:#2b91af;">SimpleClass</span> {ID = 3, Name = <span style="color:#a31515;">&quot;Second&quot;</span>, Email = <span style="color:#a31515;">&quot;my4@email.com&quot;</span>},</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">new</span> <span style="color:#2b91af;">SimpleClass</span> {ID = 4, Name = <span style="color:#a31515;">&quot;Second&quot;</span>, Email = <span style="color:#a31515;">&quot;my5@email.com&quot;</span>},</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">new</span> <span style="color:#2b91af;">SimpleClass</span> {ID = 4, Name = <span style="color:#a31515;">&quot;Second&quot;</span>, Email = <span style="color:#a31515;">&quot;my5@email.com&quot;</span>}</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };</pre>
<pre style="margin:0;">&nbsp;</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:green;">// &#1048;&#1079;&#1087;&#1086;&#1083;&#1079;&#1074;&#1072;&#1084;&#1077; &#1075;&#1086;&#1090;&#1086;&#1074;&#1080;&#1103; Distinct &#1084;&#1077;&#1090;&#1086;&#1076;, &#1082;&#1072;&#1090;&#1086; &#1084;&#1091; &#1087;&#1088;&#1077;&#1076;&#1072;&#1074;&#1072;&#1084;&#1077; &#1080;&#1085;&#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1103; &#1085;&#1072; &#1089;&#1087;&#1077;&#1094;&#1080;&#1072;&#1083;&#1085;&#1086; &#1085;&#1072;&#1087;&#1080;&#1089;&#1072;&#1085; &#1086;&#1090; &#1085;&#1072;&#1089; &#1082;&#1083;&#1072;&#1089;,</span></pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:green;">// &#1082;&#1086;&#1081;&#1090;&#1086; &#1076;&#1072; &#1089;&#1088;&#1072;&#1074;&#1085;&#1103;&#1074;&#1072; ID &#1089;&#1090;&#1086;&#1081;&#1085;&#1086;&#1089;&#1090;&#1080;&#1090;&#1077; &#1085;&#1072; &#1080;&#1085;&#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1080;&#1090;&#1077; &#1074; IEnumerable</span></pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">SimpleClass</span>&gt; distinct = list.Distinct(<span style="color:blue;">new</span> <span style="color:#2b91af;">SimpleClassIDEqualityComparer</span>());</pre>
<pre style="margin:0;">&nbsp;</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:green;">// &#1055;&#1086;&#1082;&#1072;&#1079;&#1074;&#1072;&#1084;&#1077; &#1080;&#1085;&#1089;&#1090;&#1072;&#1085;&#1094;&#1080;&#1080;&#1090;&#1077; &#1089; &#1091;&#1085;&#1080;&#1082;&#1072;&#1083;&#1085;&#1080; ID-&#1090;&#1072;</span></pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; distinct.ToList().ForEach(item =&gt; <span style="color:#2b91af;">Console</span>.WriteLine(<span style="color:#a31515;">&quot;ID={0}, Name={1}, Email={2}&quot;</span>, item.ID, item.Name, item.Email));</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:#2b91af;">Console</span>.ReadKey();</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; }</pre>
<pre style="margin:0;">}</pre>
<pre style="margin:0;">&nbsp;</pre>
<pre style="margin:0;"><span style="color:blue;">public</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">SimpleClassIDEqualityComparer</span> : <span style="color:#2b91af;">IEqualityComparer</span>&lt;<span style="color:#2b91af;">SimpleClass</span>&gt;</pre>
<pre style="margin:0;">{</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; <span style="color:blue;">public</span> <span style="color:blue;">bool</span> Equals(<span style="color:#2b91af;">SimpleClass</span> x, <span style="color:#2b91af;">SimpleClass</span> y)</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; {</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">return</span> x.ID.Equals(y.ID);</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; }</pre>
<pre style="margin:0;">&nbsp;</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; <span style="color:blue;">public</span> <span style="color:blue;">int</span> GetHashCode(<span style="color:#2b91af;">SimpleClass</span> obj)</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; {</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color:blue;">return</span> obj.ID;</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; }</pre>
<pre style="margin:0;">}</pre>
<pre style="margin:0;">&nbsp;</pre>
<pre style="margin:0;"><span style="color:blue;">public</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">SimpleClass</span></pre>
<pre style="margin:0;">{</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; <span style="color:blue;">public</span> <span style="color:blue;">int</span> ID { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; <span style="color:blue;">public</span> <span style="color:blue;">string</span> Name { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; <span style="color:blue;">public</span> <span style="color:blue;">string</span> Email { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }</pre>
<pre style="margin:0;">}</pre>
</div>
</blockquote>
<p>Горния пример (макар не много коректен, защото по принцип ID се използва за идентификатор, който не би трябвало да се повтаря) ще работи, но представете си, че вашия SimpleClass има 10 свойства и искате да използвате Distinct с всяко едно от тях (по отделно)- ще трябва да пишете или 10 различни SimpleClassXXXEqualityComparer или един, на който да му предавате нещо, което да ви показва по кое свойство ще се сравнява, и който в двата си метода да има множество if-ове или switch case-ове, или някоя друга щура идея. На всичкото отгоре, този EqualityComparer ще можете да го използвате само за класове от тип SimpleClass и евентуално негови наследници. А не ми се мисли ако ще трябва да ползвате Distinct за другите класове в проекта.</p>
<p>За да си спестите главоболията, можете да използвате следната &#8222;хитринка&#8220;: Махнете SimpleClassIDEqualityComparer класа и си добавете следния метод:</p>
<blockquote>
<div style="font-family:Courier New;font-size:10pt;color:black;background:white;">
<pre style="margin:0;"><span style="color:blue;">static</span> <span style="color:#2b91af;">IEnumerable</span>&lt;TSource&gt; Distinct&lt;TSource, TKey&gt;(<span style="color:#2b91af;">IEnumerable</span>&lt;TSource&gt; source, <span style="color:#2b91af;">Func</span>&lt;TSource, TKey&gt; keySelector)</pre>
<pre style="margin:0;">{</pre>
<pre style="margin:0;">&nbsp;&nbsp;&nbsp; <span style="color:blue;">return</span> source.GroupBy(keySelector).Select(g =&gt; g.First());</pre>
<pre style="margin:0;">}</pre>
</div>
</blockquote>
<p>Ето как може да го използвате:</p>
<blockquote>
<div style="font-family:Courier New;font-size:10pt;color:black;background:white;">
<pre style="margin:0;"><span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">SimpleClass</span>&gt; distinct = Distinct(list, t =&gt; t.ID);</pre>
</div>
</blockquote>
<p>Няма да ви напомням, че метода можете да го направите като Extension на IEnumerable&lt;&gt;.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/georgiganchev.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/georgiganchev.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/georgiganchev.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/georgiganchev.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/georgiganchev.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/georgiganchev.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/georgiganchev.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/georgiganchev.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/georgiganchev.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/georgiganchev.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/georgiganchev.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/georgiganchev.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/georgiganchev.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/georgiganchev.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=21&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://georgiganchev.wordpress.com/2009/03/01/21/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/baf1ba432a238a76d1d7de6dcc79ef2f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">georgiganchev</media:title>
		</media:content>
	</item>
		<item>
		<title>Какво е общото между Министерството на икономиката и енергетиката, SQL Injection и глупостта</title>
		<link>http://georgiganchev.wordpress.com/2008/12/16/%d0%ba%d0%b0%d0%ba%d0%b2%d0%be-%d0%b5-%d0%be%d0%b1%d1%89%d0%be%d1%82%d0%be-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d0%b5%d1%80%d1%81%d1%82%d0%b2%d0%be%d1%82%d0%be-%d0%bd/</link>
		<comments>http://georgiganchev.wordpress.com/2008/12/16/%d0%ba%d0%b0%d0%ba%d0%b2%d0%be-%d0%b5-%d0%be%d0%b1%d1%89%d0%be%d1%82%d0%be-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d0%b5%d1%80%d1%81%d1%82%d0%b2%d0%be%d1%82%d0%be-%d0%bd/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 18:00:40 +0000</pubDate>
		<dc:creator>georgiganchev</dc:creator>
				<category><![CDATA[Програмиране C# / NET Framework]]></category>
		<category><![CDATA[Министерство на икономиката и енергетиката]]></category>
		<category><![CDATA[глупост]]></category>
		<category><![CDATA[SQL Injection]]></category>

		<guid isPermaLink="false">http://georgiganchev.wordpress.com/2008/12/16/%d0%ba%d0%b0%d0%ba%d0%b2%d0%be-%d0%b5-%d0%be%d0%b1%d1%89%d0%be%d1%82%d0%be-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d0%b5%d1%80%d1%81%d1%82%d0%b2%d0%be%d1%82%d0%be-%d0%bd/</guid>
		<description><![CDATA[Общото е, че поради глупост (или друга причина), някой, който е правил сайта на министерството на икономиката и енергетиката, е допуснал възможността, да се направи SQL Injection по възможно НАЙ-ГЛУПАВИЯ начин. За тези които разбират: http://www.mi.government.bg/bids.html?id=1,2 За целите на архивирането, ето текущия отговор от сайта: Грешна заявка! &#8211; execute 933ORA-00933: SQL command not properly ended [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=14&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Общото е, че поради глупост (или друга причина), някой, който е правил сайта на министерството на икономиката и енергетиката, е допуснал възможността, да се направи SQL Injection по възможно НАЙ-ГЛУПАВИЯ начин. За тези които разбират:</p>
<p><a title="http://www.mi.government.bg/bids.html?id=1,2" href="http://www.mi.government.bg/bids.html?id=1,2" target="_blank">http://www.mi.government.bg/bids.html?id=1,2</a></p>
<p>За целите на архивирането, ето текущия отговор от сайта:</p>
<blockquote><p>Грешна заявка! &#8211; execute<br />
933ORA-00933: SQL command not properly ended<br />
offending query &#8216;select seq_id, to_char(doc_date,&#8217;dd.mm.yyyy&#8217;) doc_date, title, subtitle, annotation, comments from documents where seq_id=1,2&#8242; (execute)<br />
Ops!Грешна заявка! &#8211; execute<br />
933ORA-00933: SQL command not properly ended<br />
offending query &#8216;select text from documents connect by back_seq_id = PRIOR seq_id start with back_seq_id is null and seq_id=1,2&#8242; (execute)<br />
Няма резултат!</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td height="3" bgcolor="#ffffff"></td>
</tr>
<tr>
<td align="center" bgcolor="#000066">
<table border="0" width="95%" align="center">
<tbody>
<tr>
<td align="center"><span class="newsHeader"><strong></strong></span></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table border="0" width="95%" align="center">
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
<p>Грешна заявка! &#8211; execute<br />
933ORA-00933: SQL command not properly ended<br />
offending query &#8216;select d.SEQ_ID, d.DOC_DATE, d.TITLE from documents d where d.language=1 and d.doc_seq_id=1,2 and d.DRAFT=1 and d.back_seq_id is null order by d.APPEAR&#8217; (execute)<br />
Ops!</p></blockquote>
<p> </p>
<p> </p>
<p>Представете си някой ентусиазиран хакер да започне да екпериментира със стойността на &#8220;id&#8220; параметъра. Проблема е от поне 2 месеца (тогава го забелязах за първи път). Дори някой се опита да прати email на &#8222;webmaster&#8220;-а да му каже за какво става въпрос и да вземат мерки. Мисля че отговора беше от рода на &#8222;Няма такава електронна поща&#8220;. Срамота.</p>
<p>Имам подозрения, че връзката на министерството с глупостта не е само по линия на техния сайт.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/georgiganchev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/georgiganchev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/georgiganchev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/georgiganchev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/georgiganchev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/georgiganchev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/georgiganchev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/georgiganchev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/georgiganchev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/georgiganchev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/georgiganchev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/georgiganchev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/georgiganchev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/georgiganchev.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=14&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://georgiganchev.wordpress.com/2008/12/16/%d0%ba%d0%b0%d0%ba%d0%b2%d0%be-%d0%b5-%d0%be%d0%b1%d1%89%d0%be%d1%82%d0%be-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d0%b5%d1%80%d1%81%d1%82%d0%b2%d0%be%d1%82%d0%be-%d0%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/baf1ba432a238a76d1d7de6dcc79ef2f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">georgiganchev</media:title>
		</media:content>
	</item>
		<item>
		<title>System.Data.Linq.Binary (SQL timestamp) + DataContractSerializer</title>
		<link>http://georgiganchev.wordpress.com/2008/11/07/systemdatalinqbinary-sql-timestamp-datacontractserializer/</link>
		<comments>http://georgiganchev.wordpress.com/2008/11/07/systemdatalinqbinary-sql-timestamp-datacontractserializer/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 20:20:48 +0000</pubDate>
		<dc:creator>georgiganchev</dc:creator>
				<category><![CDATA[Програмиране C# / NET Framework]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[DataContractSerializer]]></category>
		<category><![CDATA[System.Data.Linq.Binary]]></category>
		<category><![CDATA[timestamp]]></category>

		<guid isPermaLink="false">http://georgiganchev.wordpress.com/?p=7</guid>
		<description><![CDATA[Онзи ден се занимавах с &#8222;concurrency&#8220; при &#8222;n-tier&#8220; applications. Ползвам LINQ to SQL за извличане на информация от базата и DataContractSerializer (WCF Service) за пренасяне на информацията до и от клиента. За тестовете си добавих едно поле в таблицата от тип timestamp. LINQ to SQL дизайнера ми го мапна към System.Data.Linq.Binary тип. Всичко вече беше [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=7&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Онзи ден се занимавах с &#8222;concurrency&#8220; при &#8222;n-tier&#8220; applications. Ползвам LINQ to SQL за извличане на информация от базата и DataContractSerializer (WCF Service) за пренасяне на информацията до и от клиента. За тестовете си добавих едно поле в таблицата от тип timestamp. LINQ to SQL дизайнера ми го мапна към System.Data.Linq.Binary тип. Всичко вече беше наместено и дойде време да си разменяме съобщения с клиента. Извличам данните от таблицата, сериализирам ги и ги пращам на клиента. Той модифицира част от тях и ги връща заедно с timestamp полето което е получил от мен. Пристигат данните при мен, гледам ID-то на Entity-то, прочитам го от базата и сравнявам timestamp-ите от клиента и от базата за да върна някакво човешко съобщение при разлика в двете. Метода Equals на System.Data.Linq.Binary е overload-нат за да може да приема System.Data.Linq.Binary. За мое нещастие обаче, Equals ми връща винаги false. Погледнах в съдържанието на това което съм прочел от базата и това, което ми праща клиента &#8211; 8-те байта които всъщност представляват System.Data.Linq.Binary са еднакви и на двете Entity-та, но Equals упорито продължава да ми казва че не са еднакви. Ето един примерен код, който да симулира това състояние (трябват ви референции към System.Data.Linq и System.Runtime.Serialization):</p>
<p>За да вземете сорс кода правилно &#8211; Copy/Paste го в Wordpad, и после от там Copy/Paste във VS.</p>
<blockquote>
<div style="font-family:Courier New;font-size:10pt;color:black;background:white;">
<pre style="margin:0;"><span style="color:blue;">using</span> System;</pre>
<pre style="margin:0;"><span style="color:blue;">using</span> System.Data.Linq;</pre>
<pre style="margin:0;"><span style="color:blue;">using</span> System.IO;</pre>
<pre style="margin:0;"><span style="color:blue;">using</span> System.Runtime.Serialization;</pre>
<pre style="margin:0;"> </pre>
<pre style="margin:0;"><span style="color:blue;">namespace</span> ConsoleApplication1</pre>
<pre style="margin:0;">{</pre>
<pre style="margin:0;">    <span style="color:blue;">class</span> <span style="color:#2b91af;">Program</span></pre>
<pre style="margin:0;">    {</pre>
<pre style="margin:0;">        <span style="color:blue;">static</span> <span style="color:blue;">void</span> Main(<span style="color:blue;">string</span>[] args)</pre>
<pre style="margin:0;">        {</pre>
<pre style="margin:0;">            <span style="color:blue;">byte</span>[] binaryData = <span style="color:blue;">new</span> <span style="color:blue;">byte</span>[] { 1, 2, 3, 4, 5, 6, 7, 8 };</pre>
<pre style="margin:0;"> </pre>
<pre style="margin:0;">            <span style="color:green;">// С долния ред симулираме DataContext.SomeTable.Single(...)</span></pre>
<pre style="margin:0;">            <span style="color:#2b91af;">Binary</span> originalBinary = <span style="color:blue;">new</span> <span style="color:#2b91af;">Binary</span>(binaryData);</pre>
<pre style="margin:0;"> </pre>
<pre style="margin:0;">            <span style="color:green;">// Сега да симулираме десериализираното Entity, което е дошло от клиента</span></pre>
<pre style="margin:0;">            <span style="color:green;">// Използваме DataContractSerializer (по default при WCF)</span></pre>
<pre style="margin:0;">            <span style="color:#2b91af;">DataContractSerializer</span> dcs = <span style="color:blue;">new</span> <span style="color:#2b91af;">DataContractSerializer</span>(<span style="color:blue;">typeof</span>(<span style="color:#2b91af;">Binary</span>));</pre>
<pre style="margin:0;">            <span style="color:#2b91af;">MemoryStream</span> ms = <span style="color:blue;">new</span> <span style="color:#2b91af;">MemoryStream</span>();</pre>
<pre style="margin:0;">            <span style="color:green;">// Първо сериализираме в ms</span></pre>
<pre style="margin:0;">            dcs.WriteObject(ms, originalBinary);</pre>
<pre style="margin:0;">            ms.Position = 0;</pre>
<pre style="margin:0;">            <span style="color:green;">// А сега десериализираме от ms за да получим оригиналното Binary</span></pre>
<pre style="margin:0;">            <span style="color:#2b91af;">Binary</span> deserializedBinary = dcs.ReadObject(ms) <span style="color:blue;">as</span> <span style="color:#2b91af;">Binary</span>;</pre>
<pre style="margin:0;">            ms.Close();</pre>
<pre style="margin:0;"> </pre>
<pre style="margin:0;">            <span style="color:green;">// Ето го и резултата</span></pre>
<pre style="margin:0;">            <span style="color:#2b91af;">Console</span>.WriteLine(<span style="color:#a31515;">"Original Binary bytes : "</span> + <span style="color:#2b91af;">BitConverter</span>.ToString(originalBinary.ToArray()));</pre>
<pre style="margin:0;">            <span style="color:#2b91af;">Console</span>.WriteLine(<span style="color:#a31515;">"Deserialized Binary bytes : "</span> + <span style="color:#2b91af;">BitConverter</span>.ToString(deserializedBinary.ToArray()));</pre>
<pre style="margin:0;">            <span style="color:#2b91af;">Console</span>.WriteLine(<span style="color:#a31515;">"Original.Equals(Deserialized) = "</span> + originalBinary.Equals(deserializedBinary).ToString());</pre>
<pre style="margin:0;"> </pre>
<pre style="margin:0;">            <span style="color:#2b91af;">Console</span>.ReadLine();</pre>
<pre style="margin:0;">        }</pre>
<pre style="margin:0;">    }</pre>
<pre style="margin:0;">}</pre>
</div>
<p> </p></blockquote>
<p>Резултата от горния код е:</p>
<pre>Original Binary bytes : 01-02-03-04-05-06-07-08
Deserialized Binary bytes : 01-02-03-04-05-06-07-08
Original.Equals(Deserialized) = False</pre>
<p>За да получа повече информация за System.Data.Linq.Binary естествено си пуснах Reflector. Отговора на въпроса защо Equals при тази ситуация връща false е, че при десериализацията с DataContractSerializer не се минава през конструктора на System.Data.Linq.Binary. В този конструктор се сетва hashCode стойността на 8-те байта. В Equals метода, преди да се пристъпи към сравняване на 8-те байта на двете System.Data.Linq.Binary се проверяват техните hashCode. И понеже едното не е минало през нормално инстанцииране (това, което е десериализирано) а другото е минало (това, което е взето от базата с DataContext-а), hashCode на първото е null (в System.Data.Linq.Binary е декларирано като int?) а на второто е някаква &#8222;нормална&#8220; стойност. Това е причината Equals да връща false въпреки че всички 8 байта на двете инстанции са еднакви. Един от възможните workaround в този случай за които се сетих е преди да използвате Equals, да извикате метода GetHashCode() на десериализираното Entity. Вътрешно, той ще сетне hashCode member-а и следващите Equals ще ви връщат вече true.</p>
<p>Дизайна на System.Data.Linq.Binary е такъв, че не можем да го сравняваме &#8222;безопасно&#8220; чрез Equals (между другото и == не работи) когато става въпрос за &#8222;нормални&#8220; и десериализирани инстанции. Ако работите с LINQ to SQL и timestamp за concurrency, едното решение е да промените типа на member-а който се създава от дизайнера от System.Data.Linq.Binary на byte[]. DataContext ще продължава да ви връща правилните стойности на timestamp полето от таблицата. Благодарение на extension methods, сравнението за еднаквост на две byte[] може да стане така:</p>
<blockquote>
<div style="font-family:Courier New;font-size:10pt;color:black;background:white;">
<pre style="margin:0;"><span style="color:blue;">if</span> (byteArray1.SequenceEqual(byteArray2))</pre>
</div>
</blockquote>
<p>Горното разбира се може да се използва и при &#8222;различните&#8220; System.Data.Linq.Binary &#8211; просто ще трябва да пишете нещо като:</p>
<blockquote>
<div style="font-family:Courier New;font-size:10pt;color:black;background:white;">
<pre style="margin:0;"><span style="color:blue;">if</span> (originalBinary.ToArray().SequenceEqual(deserializedBinary.ToArray()))</pre>
</div>
</blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/georgiganchev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/georgiganchev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/georgiganchev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/georgiganchev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/georgiganchev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/georgiganchev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/georgiganchev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/georgiganchev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/georgiganchev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/georgiganchev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/georgiganchev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/georgiganchev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/georgiganchev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/georgiganchev.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=7&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://georgiganchev.wordpress.com/2008/11/07/systemdatalinqbinary-sql-timestamp-datacontractserializer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/baf1ba432a238a76d1d7de6dcc79ef2f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">georgiganchev</media:title>
		</media:content>
	</item>
		<item>
		<title>C# / NET Framework</title>
		<link>http://georgiganchev.wordpress.com/2008/11/07/c-net-framework/</link>
		<comments>http://georgiganchev.wordpress.com/2008/11/07/c-net-framework/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 15:48:19 +0000</pubDate>
		<dc:creator>georgiganchev</dc:creator>
				<category><![CDATA[Програмиране C# / NET Framework]]></category>

		<guid isPermaLink="false">http://georgiganchev.wordpress.com/?p=3</guid>
		<description><![CDATA[Да видим ще имам ли време да споделям скромните си знания и умения с вас. Очаквам да ми го върнете тъпкано<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=3&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Да видим ще имам ли време да споделям скромните си знания и умения с вас. Очаквам да ми го върнете тъпкано <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/georgiganchev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/georgiganchev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/georgiganchev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/georgiganchev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/georgiganchev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/georgiganchev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/georgiganchev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/georgiganchev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/georgiganchev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/georgiganchev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/georgiganchev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/georgiganchev.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/georgiganchev.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/georgiganchev.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=georgiganchev.wordpress.com&amp;blog=5414597&amp;post=3&amp;subd=georgiganchev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://georgiganchev.wordpress.com/2008/11/07/c-net-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/baf1ba432a238a76d1d7de6dcc79ef2f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">georgiganchev</media:title>
		</media:content>
	</item>
	</channel>
</rss>
