<?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>Jérôme Lambert &#187; Effigy</title>
	<atom:link href="https://blog.developpez.com/jerome/pcategory/effigy/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/jerome</link>
	<description>My Microsoft Development World</description>
	<lastBuildDate>Mon, 17 Dec 2012 11:34:42 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Astuce LINQ : Réaliser des jointures avec des clés composites</title>
		<link>https://blog.developpez.com/jerome/p6142/net/astuce_linq_realiser_des_jointures_avec</link>
		<comments>https://blog.developpez.com/jerome/p6142/net/astuce_linq_realiser_des_jointures_avec#comments</comments>
		<pubDate>Fri, 01 Aug 2008 02:03:45 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Effigy]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans le cadre d&#8217;un projet où mes pas dans Linq commençait tout doucement à se faire plus sûr, je me suis retrouvé contraint et forcé à réaliser une requête Linq to SQL avec une jointure. Rien de plus facile, me direz-vous et je ne vais pas vous contredire&#8230; Me voila donc parti dans ma jointure avec les classiques : from &#8230; join &#8230; on &#8230; equals &#8230; select&#8230; Allez, je vais faire plu parlant, et [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><font face="Tahoma" size="2">Dans le cadre d&rsquo;un projet où mes pas dans Linq commençait tout doucement à se faire plus sûr, je me suis retrouvé contraint et forcé à réaliser une requête Linq to SQL avec une jointure. Rien de plus facile, me direz-vous et je ne vais pas vous contredire&#8230;</font></p>
<p><span id="more-7"></span><br />
<font face="Tahoma" size="2"></font>
<p><font face="Tahoma" size="2">Me voila donc parti dans ma jointure avec les classiques :</font></p>
<table style="border-right: #6699cc 1px solid; border-top: #6699cc 1px solid; border-left: #6699cc 1px solid; border-bottom: #6699cc 1px solid; background-color: #eeeeee" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top" width="100%">
<p><font face="Tahoma" size="2">from &#8230;              <br />join &#8230; on &#8230; equals &#8230;               <br />select&#8230; </font></p>
</td>
</tr>
</tbody>
</table>
<p><font face="Tahoma" size="2">Allez, je vais faire plu parlant, et pour faire enrager ceux qui innovent en matière de base de données pour appuyer leurs exemples, je vais utiliser la base de données Northwind de Microsoft.</font></p>
<p><font face="Tahoma" size="2">Pour rappel, voici le lien où vous procurer les scripts de création de cette DB sous SQL Server :      <br /></font><a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;displaylang=en"><font face="Tahoma" size="2">http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;displaylang=en</font></a></p>
<p><font face="Tahoma" size="2">Donc, je disais&#8230; en plein développement sous une chaleur accablante, je m&rsquo;aperçois que je n&rsquo;ai aucune méthode qui me permet de récupérer les zones dans lesquelles les employés travaillent. Pas de panique, au vue du modèle Linq To SQL dans mon projet, je peux me débrouiller avec les tables &laquo;&nbsp;Employee&nbsp;&raquo;, &laquo;&nbsp;EmployeeTerritory&nbsp;&raquo; et &laquo;&nbsp;Territory&nbsp;&raquo;.</font></p>
<p> <center><a href="http://blog.developpez.com/media/130/WindowsLiveWriter/AstuceLINQRaliserdesjointuresavecdesclsc_14CFD/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="75" alt="image" src="http://blog.developpez.com/media/130/WindowsLiveWriter/AstuceLINQRaliserdesjointuresavecdesclsc_14CFD/image_thumb.png" width="724" border="0" /></a> </center><center><a href="http://blog.developpez.com/media/130/WindowsLiveWriter/AstuceLINQRaliserdesjointuresavecdesclsc_14CFD/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="117" alt="image" src="http://blog.developpez.com/media/130/WindowsLiveWriter/AstuceLINQRaliserdesjointuresavecdesclsc_14CFD/image_thumb_1.png" width="195" border="0" /></a> </center>
<p><font face="Tahoma" size="2">En regardant de plus près la table de relation &laquo;&nbsp;EmployeeTerritory&nbsp;&raquo;, je m&rsquo;aperçois de suite que j&rsquo;ai affaire à une clé composite&#8230; Et alors me direz-vous ? Et je me suis dit la même chose étant donné que tout comme avec SQL, Linq supporte l&rsquo;opérateur JOIN&#8230; Je me lance donc dans la création d&rsquo;une belle méthode que je vous livre ci-dessous :</font></p>
<table style="border-right: #6699cc 1px solid; border-top: #6699cc 1px solid; border-left: #6699cc 1px solid; border-bottom: #6699cc 1px solid; background-color: #eeeeee" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top" width="100%">
<p><font face="Tahoma" size="2">public List&lt;string&gt; GetEmployeeInTerritories()              <br />{               <br />    using (NorthwindModelDataContext ctx = new NorthwindModelDataContext())               <br />    {               <br />        var query = from employee in ctx.Employees               <br />                    from territory in ctx.Territories               <br />                    join employeeterritory in ctx.EmployeeTerritories               <br />                    on employee.EmployeeID equals employeeterritory.EmployeeID               <br />                    &amp;&amp; territory.TerritoryID equals employeeterritory.TerritoryID </font></p>
<p><font face="Tahoma" size="2">                    select employee.FirstName + &nbsp;&raquo; &nbsp;&raquo; + employee.LastName + &nbsp;&raquo; in &nbsp;&raquo; + territory.TerritoryDescription; </font></p>
<p><font face="Tahoma" size="2">        return query.ToList();              <br />    }               <br />}</font></p>
</td>
</tr>
</tbody>
</table>
<p><font face="Tahoma" size="2">Petit soucis, il n&rsquo;est pas possible de faire une jointure avec une clé composite de la même façon qu&rsquo;avec SQL (en utilisant des &laquo;&nbsp;&amp;&amp;&nbsp;&raquo; pour spécifier chaque critère de la jointure).</font></p>
<p><font face="Tahoma" size="2">Fallait donc le savoir, cette syntaxe n&rsquo;est pas possible avec Linq mais évidemment, Microsoft a pensé à nous et il y a donc une <em>astuce</em>. Le truc est simple, il suffit de passer par un type anonyme. Les seules restrictions sont :</font></p>
<ul>
<li><font face="Tahoma" size="2">Les noms des propriétés, c&rsquo;est à dire que vous devez comparer des types anonymes qui ont les mêmes noms de propriétés.</font></li>
<li><font face="Tahoma" size="2">L&rsquo;ordre des propriétés, c&rsquo;est à dire que les propriétés de vos objets anonymes doit apparaître dans le même ordre. </font></li>
</ul>
<p><font face="Tahoma" size="2">Après une grande inspiration sur la documentation trouvée sur MSDN (en même temps, c&rsquo;était dur de faire différemment), voici le code qui compile enfin correctement et mieux encore, il renvoie le bon résultat&#8230; Quel talent !</font></p>
<table style="border-right: #6699cc 1px solid; border-top: #6699cc 1px solid; border-left: #6699cc 1px solid; border-bottom: #6699cc 1px solid; background-color: #eeeeee" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top" width="100%">
<p><font face="Tahoma" size="2">public List&lt;string&gt; GetEmployeeInTerritories()              <br />{               <br />    using (NorthwindModelDataContext ctx = new NorthwindModelDataContext())               <br />    {               <br />        var query = from employee in ctx.Employees               <br />                    from territory in ctx.Territories               <br />                    join employeeterritory in ctx.EmployeeTerritories               <br />                    on new { employee.EmployeeID, territory.TerritoryID } equals new { employeeterritory.EmployeeID, employeeterritory.TerritoryID } </font></p>
<p><font face="Tahoma" size="2">                    select employee.FirstName + &nbsp;&raquo; &nbsp;&raquo; + employee.LastName + &nbsp;&raquo; in &nbsp;&raquo; + territory.TerritoryDescription; </font></p>
<p><font face="Tahoma" size="2">        return query.ToList();              <br />    }               <br />}</font></p>
</td>
</tr>
</tbody>
</table>
<p><font face="Tahoma" size="2">Et histoire de vous épargner une recherche de 20 secondes pour trouver la page exacte dans la documentation MSDN qui explique tout ça, voici le </font><a href="http://msdn.microsoft.com/fr-fr/library/bb907099.aspx"><strong><font face="Tahoma" size="2">lien</font></strong></a><font face="Tahoma" size="2">.</font></p>
<p><font face="Tahoma" size="2">Bon Linq à tous !</font></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>
