<?xml version="1.0"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:georss="http://www.georss.org/georss" version="2.0">
  <channel>
    <georss:point>50.7234 14.9296</georss:point>
    <title>rarouš.weblog  - komentáře k článku</title>
    <link>http://rarous.net/
    <description>Komentáře k článkům rarouš.weblog.</description>
    <copyright>© 2004 - 2008 Aleš Roubíček. All rights reserved.</copyright>
    <generator>Gryphoon Weblog v1.78</generator>
    <item>
      <author>Steve</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1172</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1172
      <pubDate>Sun, 31 Jan 2010 12:00:03 GMT</pubDate>
      <description>
&lt;p&gt;Vypadá to hezky, díky práci nad IQueryable&amp;lt;&amp;gt; není
implementace Query objektu závislá na použitém ORM a mohli bychom
teoreticky Query objekty implementovat i&amp;#160;v rámci aplikační
vrstvy/fasády pro ní.&lt;/p&gt;

&lt;p&gt;S&amp;#160;čím bych měl možná u&amp;#160;takového řešení problém
je, že IQueryable&amp;lt;&amp;gt; jako zdroj pro query object podle mě nemusí
stačit (nebo ano?), někdy by člověk chtěl udělat takový dotaz,
který NHibernate.Linq (resp. Criteria API) rozvine v&amp;#160;nějaké
strašné SQL, ručně v&amp;#160;raw SQL, někdy by člověk chtěl
využít specifik dané databáze jako třeba hierarchy id&amp;#8230;&lt;/p&gt;

&lt;p&gt;Možností by bylo jako parametr pro Fetch nabídnou ISession, ale to
zase ztrácíme nezávislost na ORM/databázi&amp;#8230;&lt;/p&gt;

&lt;p&gt;mimochodem bitva repository/DA&amp;#173;O/Query objects je trefně
popsaná na &lt;a
href="http://nhforge.org/blogs/nhibernate/archive/2009/09/07/part-8-daos-repositories-or-query-objects.aspx"&gt;nhforge&lt;/a&gt;&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1173</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1173
      <pubDate>Sun, 31 Jan 2010 13:16:01 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/377-domenove-dotazy.aspx#km1172"&gt;[1]
Steve:&lt;/a&gt; Použití &lt;code&gt;IQueryable&lt;/code&gt; je specifické pro tento
příklad, klidně na vstupu může být &lt;code&gt;ISession&lt;/code&gt; nebo
&lt;code&gt;DbConnection&lt;/code&gt; to už je implementační detail. :)&lt;/p&gt;

&lt;p&gt;Strašnému SQL generovanému ORM nástrojem se dá předejít
správným mapováním. K&amp;#160;tomu nám může pomoci např. &lt;a
href="http://www.nhprof.com/"&gt;NHProf&lt;/a&gt; nebo podobný nástroj.&lt;/p&gt;

&lt;p&gt;Nezávislost na ORM je ve většině případů zcela zbytečná. Jen
málo aplikací bude potřebovat nezávislost na ORM, či konkrétním
DB stroji.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Augi</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1174</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1174
      <pubDate>Sun, 31 Jan 2010 17:36:24 GMT</pubDate>
      <description>
&lt;p&gt;A&amp;#160;ten IQueryExecutor používáš jako generickou náhradu
Repository?&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Steve</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1175</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1175
      <pubDate>Sun, 31 Jan 2010 18:00:54 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/377-domenove-dotazy.aspx#km1173"&gt;[2]
Aleš Roubíček:&lt;/a&gt; Když ale použiji ISession (DbConnection), tak
bych měl mít, podle mého názoru, Query objekty v&amp;#160;datové
vrstvě, potom ale vznikne přímá závistost aplikační vrstvy na té
datové (narozdíl od DAO nebo repository objektů-k&amp;#160;těm
přistupuji přes interface).&lt;/p&gt;

&lt;p&gt;Myšlenka Query objektů se mi líbí, ale s&amp;#160;tahle závislost mi
trochu vadí a zajímá mne, jestli je nějak řešitelná&amp;#8230;
Možná je problém ve snaze o &amp;#8222;čistotu&amp;#8220; návrhu za každou
cenu a přitom by mohlo být efektivní udělat občas takový malý
ústupek&amp;#8230;&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1176</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1176
      <pubDate>Sun, 31 Jan 2010 21:30:31 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/377-domenove-dotazy.aspx#km1174"&gt;[3]
Augi:&lt;/a&gt; U&amp;#160;mne je &lt;code&gt;IRepository&amp;lt;T&amp;gt;&lt;/code&gt; zdrojem
dodávajícím &lt;code&gt;IQueryable&amp;lt;T&amp;gt;&lt;/code&gt; pro
&lt;code&gt;IQueryExecutor&amp;lt;T&amp;gt;&lt;/code&gt;. Což neni úplně čisté
řešení, ale je dané historicky evolucí projektu. :)&lt;/p&gt;

&lt;p&gt;&lt;a
href="http://rarous.net/weblog/377-domenove-dotazy.aspx#km1175"&gt;[4]
Steve:&lt;/a&gt; Otázka je, co považuješ za datovou vrstvu. Pro někoho to
je databáze, pro jiného ADO.NET, pro dalšího ORM Framework&amp;#8230;
Osobně jsem na úrovni abstrakce s &lt;code&gt;IQueryable&lt;/code&gt;. Vzhledem
k&amp;#160;tomu, že používám Castle ActiveRecord, je mapování
součástí mého doménového modelu, který prosakuje i&amp;#160;do views.
Žádný problém s&amp;#160;tím nemám. Ani problémy s&amp;#160;čistotou.
Spíš bych pak měl problém s&amp;#160;překompikova&amp;#173;ností.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Besnik</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1225</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1225
      <pubDate>Mon, 13 Sep 2010 14:56:05 GMT</pubDate>
      <description>&lt;p&gt;Zdar, tento problem sa snazim riesit cez generic repository a
specification pattern, nieco o tom som popisal tu &lt;a
href="http://besnikgeek.blogspot.com/2010/08/specification-pattern-versus-query.html"&gt;http://besnikgeek.blogspot.com/…s-query.html&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;V zmysle
OCP data z repozitara tahas takto (priklad z &lt;a
href="http://code.google.com/p/genericrepository/"&gt;http://code.google.com/…crepository/&lt;/a&gt;):&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ICustomerRepository
customerRepository =&lt;br
/&gt;this.IoC.Resol­ve&amp;lt;ICustomerRe­pository&amp;gt;(uni­tOfWork,
specification­Locator);&lt;br /&gt;&lt;br /&gt;IList&amp;lt;Customer&amp;gt; =
customerReposi­tory.Specify&amp;lt;I­CustomerSpeci­fication&amp;gt;()&lt;br
/&gt;.NameStartsWit­h("Ales")&lt;br /&gt;.OlderThan(18)&lt;br /&gt;.ToResult()&lt;br
/&gt;.Take(3)&lt;br /&gt;.ToList();&lt;/code&gt;&lt;/pre&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Augi</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1256</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1256
      <pubDate>Wed, 02 Feb 2011 16:56:08 GMT</pubDate>
      <description>&lt;p&gt;[4]Aleš to má jednoduchý, protože používá IQueryable, které
si může dovolit pronést skrze všechny vrstvy.&lt;/p&gt;&lt;p&gt;Pokud ale chceme
pracovat jinak (ne s IQueryable), tak je IMHO potřeba důsledně
oddělit „popis dotazu“ (ten je v doménové/apli­kační vrstvě)
a „vykonání dotazu“ – to je úkol infrastrukturního kódu
(tedy repository), který musí umět dotaz správně interpretovat (tj.
převést ho do správného LINQ dotazu, SQL dotazu apod.). Za takový
obecný popis dotazu lze považovat expression trees, čímž se
dostaneme jen o jednu úroveň níž než je IQueryable.&lt;/p&gt;&lt;p&gt;Taková
repository by měla interface, jehož zásadní metoda by
vypadala takto:&lt;/p&gt;&lt;p&gt;IEnumerable&amp;lt;TRe­sult&amp;gt;
Fetch&amp;lt;TResult&amp;gt;(Ex­pression&amp;lt;Func&amp;lt;I­Queryable&amp;lt;T&amp;gt;,
IQueryable&amp;lt;TRe­sult&amp;gt;&amp;gt;&amp;gt; query);&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Tim</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1314</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1314
      <pubDate>Wed, 14 Dec 2011 09:41:40 GMT</pubDate>
      <description>&lt;p&gt;Ahoj, doménové dotazy se mi moc líbí. Nemůžu se ale nějak
vypořádat s tím, že na rozdíl od použití repository, tak jak je
nahoře, musím do Query vytáhnout všechny „tabuky“ (IQueryable
objekty), nad kterými stavím dotaz. Primárně by mi to nevadilo a
těžko bych asi psal dotaz, když by nebylo nad čím ho psát.
Otázkou je, jak je mám do toho Query dostat?&lt;/p&gt;&lt;p&gt;Pokud například
potřebuji QueryObjekt, který by z knihovny vyndal seznam knih od
anglického autora, mohlo by to vypadat následovně?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class BooksByAuthorNationalityQuery {&lt;br /&gt;
public virtual IEnumerable&amp;lt;Book&amp;gt; Fetch(IQueryable&amp;lt;Book&amp;gt; bookTable, IQueryable&amp;lt;AuthorOfBook&amp;gt; authorOfBookTable, IQueryable&amp;lt;Author&amp;gt; AuthorTable) {
 // return fetch z CreateQuery:
 // join tabulek, where podle nationality, select Book.
 } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pro tenhle QueryObjekt, už ale nepoužiji
IQueryExecutor a musím vytvořit extra IBookAndAutor­QueryExecutor. Ve
finále se mi pak repository, tak jak je nahoře rozpadne na Query
objekty a ne o mnoho méně „specializovaných“ QueryExecutor
oběktů. To ale můžu rovnou udělat „specializované“ repository
IBookByAuthor­NationalityRe­pository s metodou Fetch().&lt;/p&gt;&lt;p&gt;Mám
takový pocit, že tohle už někdo musel řešit a že mi něco uniká.
Děkuji za nakopnutí správným směrem:)&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1315</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1315
      <pubDate>Sat, 17 Dec 2011 12:08:56 GMT</pubDate>
      <description>&lt;p&gt;Přemýšlíš příliš relačně. Ve většině případů, bude
mít objekt &lt;code&gt;Book&lt;/code&gt; vazbu na Autora a z něj můžeš
skládat dotaz bez problémů. Vždy záleží na tom, jak máš
namodelovaný objektový model.&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Ben</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1327</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1327
      <pubDate>Thu, 22 Dec 2011 09:25:11 GMT</pubDate>
      <description>&lt;p&gt;Mohl bys zde dat i implementaci IQueryExecutor pro výše popsány
Article, prosím?&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1328</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1328
      <pubDate>Thu, 22 Dec 2011 09:45:11 GMT</pubDate>
      <description>&lt;p&gt;[10] Implementace je závislá na konkrétní použité technologii.
Tady ukázka z hlavy pro EF:&lt;/p&gt;&lt;pre
class="csharp"&gt;&lt;code&gt;public class ArticlesQueryExecutor : IQueryExecutor&amp;lt;Article&amp;gt; {
  readonly DbContext dbContext;

  public ArticlesQueryExecutor(DbContext dbContext) {
    this.dbContext = dbContext;
  }

  public int Count(IQueryObject&amp;lt;Article&amp;gt; query) {
    return query.Count(dbContext.Set&amp;lt;Article&amp;gt;());
  }

  public IEnumerable&amp;lt;Article&amp;gt; Fetch(IQueryObject&amp;lt;Article&amp;gt; query) {
    return query.Fetch(dbContext.Set&amp;lt;Article&amp;gt;());
  }

  public Article FetchOne(IQueryObject&amp;lt;Article&amp;gt; query) {
    return query.FetchOne(dbContext.Set&amp;lt;Article&amp;gt;());
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jak vidíš, je to opravdu jednoduchý kód.&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Ben</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1329</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1329
      <pubDate>Thu, 22 Dec 2011 12:36:21 GMT</pubDate>
      <description>&lt;p&gt;[11] diky moc! Jen mi tu schází jedna věc – pokud se nejedna
o web aplikaci, kde životnost dbcontextu je dana nejakym
injektorem – kde uzavírám připojeni na db?&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1330</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1330
      <pubDate>Thu, 22 Dec 2011 13:20:57 GMT</pubDate>
      <description>&lt;p&gt;To záleží v jakém scope připojení otevíráš. Injektovat
můžeš i v newebových aplikacích.&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Ben</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1331</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1331
      <pubDate>Thu, 22 Dec 2011 16:01:49 GMT</pubDate>
      <description>&lt;p&gt;[13] Ad scope) U web aplikací je to snadné, scope je dán
requestem. U windows services +/- taky, ale u standardní Windows
aplikace je to složitější. Taky se mi moc nelíbí, že aplikační
vrstva je „zaprasena“ znalostí DbContextu (v tomto případě).
Sám jsem to řešil tak, že jsem pracoval s repository vždy
v rámci sekce using: using (var repository = new ArticleRepository)
{…}, kde v metodě Dispose() bylo uzavření spojení
s DB.&lt;/p&gt;&lt;p&gt;Jinak ještě jeden dotaz – kde jsou metody pro
vytvoření, update a smazání objektu?&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Doménové dotazy</title>
      <guid>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1335</guid>
      <link>http://rarous.net/weblog/377-domenove-dotazy.aspx#km1335
      <pubDate>Fri, 23 Dec 2011 08:31:50 GMT</pubDate>
      <description>&lt;p&gt;Vytváření, update a mazání nemaj s dotazováním nic
společnýho. To je zodpovědnost Unit of Work. Tj. v případě EF
DbContextu.&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
  </channel>
</rss>
