<?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>Blog de Matthieu MEZIL &#187; LINQ</title>
	<atom:link href="https://blog.developpez.com/matthieu/pcategory/net/linq/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/matthieu</link>
	<description></description>
	<lastBuildDate>Fri, 14 Dec 2007 21:05:16 +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>LINQ Select VB != Select C# quand on fait un select sur un type anonyme</title>
		<link>https://blog.developpez.com/matthieu/p4379/net/linq_select_vb_select_c_quand_on_fait_un</link>
		<comments>https://blog.developpez.com/matthieu/p4379/net/linq_select_vb_select_c_quand_on_fait_un#comments</comments>
		<pubDate>Sat, 13 Oct 2007 07:48:10 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Imaginons une classe Personne avec plusieurs propriétés telles que le Nom, Prenom, DateNaissance, Adresse, etc. Pour créer un type anonyme en C#, il suffit de faire : new { Nom = p.Nom, Prenom = p.Prenom } Dans ce cas, les noms des propriétés étant les mêmes, on pourra même directement écrire : new { p.Nom, p.Prenom } De la même manière, en VB, il suffit d&#8217;écrire New With { p.Nom, p.Prenom } Si vous voulez [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Imaginons une classe Personne avec plusieurs propriétés telles que le Nom, Prenom, DateNaissance, Adresse, etc.</p>
<p>Pour créer un type anonyme en C#, il suffit de faire :</p>
<p><code class="codecolorer text default"><span class="text">new { Nom = p.Nom, Prenom = p.Prenom }</span></code></p>
<p>Dans ce cas, les noms des propriétés étant les mêmes, on pourra même directement écrire : </p>
<p><code class="codecolorer text default"><span class="text">new { p.Nom, p.Prenom }</span></code></p>
<p>De la même manière, en VB, il suffit d&rsquo;écrire</p>
<p><code class="codecolorer text default"><span class="text">New With { p.Nom, p.Prenom }</span></code></p>
<p>Si vous voulez faire une requête LINQ et ne renvoyer que le nom et le prénom, il faut utiliser un type anonyme.</p>
<p>Fort logiquement, en C#, il faut faire : </p>
<p><code class="codecolorer text default"><span class="text">from p in persons select new {p.Nom, p.Prenom}</span></code></p>
<p>En VB, le type anonyme va être créé pour nous avec l&rsquo;écriture suivante (plus proche du SQL) : </p>
<p><code class="codecolorer text default"><span class="text">from p in persons select p.Nom, p.Prenom</span></code></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LINQ : attention à bien l&#8217;utiliser</title>
		<link>https://blog.developpez.com/matthieu/p4477/net/linq_attention_a_bien_l_utiliser</link>
		<comments>https://blog.developpez.com/matthieu/p4477/net/linq_attention_a_bien_l_utiliser#comments</comments>
		<pubDate>Sat, 03 Nov 2007 20:42:55 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le défaut de LINQ c&#8217;est qu&#8217;il va devenir beaucoup plus facile de faire du code moins performant. Prenons un exemple : public class Client { &#160; private List&#60;Facture&#62; _factures; &#160; &#160; public string Nom { get; set; } &#160; public string Prenom { get; set; } &#160; public List&#60;Facture&#62; Factures &#160; { &#160; &#160; get &#160; &#160; { &#160; &#160; &#160; if (_factures == null) &#160; &#160; &#160; &#160; _factures = new List&#60;Facture&#62;(); &#160; &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le défaut de LINQ c&rsquo;est qu&rsquo;il va devenir beaucoup plus facile de faire du code moins performant.<br />
Prenons un exemple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class Client <br />
{ <br />
&nbsp; private List&lt;Facture&gt; _factures; <br />
&nbsp;<br />
&nbsp; public string Nom { get; set; } <br />
&nbsp; public string Prenom { get; set; } <br />
&nbsp; public List&lt;Facture&gt; Factures <br />
&nbsp; { <br />
&nbsp; &nbsp; get <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; if (_factures == null) <br />
&nbsp; &nbsp; &nbsp; &nbsp; _factures = new List&lt;Facture&gt;(); <br />
&nbsp; &nbsp; &nbsp; return _factures; <br />
&nbsp; &nbsp; } <br />
&nbsp; } <br />
} <br />
&nbsp;<br />
public class Facture <br />
{ <br />
&nbsp; private Client _client; <br />
&nbsp;<br />
&nbsp; public Client Client <br />
&nbsp; { <br />
&nbsp; &nbsp; get { return _client; } <br />
&nbsp; &nbsp; set <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; if (_client != null) <br />
&nbsp; &nbsp; &nbsp; &nbsp; _client.Factures.Remove(this); <br />
&nbsp; &nbsp; &nbsp; _client = value; <br />
&nbsp; &nbsp; &nbsp; _client.Factures.Add(this); <br />
&nbsp; &nbsp; } <br />
&nbsp; } <br />
&nbsp; public decimal Prix { get; set; } <br />
}</div></div>
<p>Imaginons que l&rsquo;on veuille récupérer les clients ayant dépensé au moins 50 euros en les triant par ordre décroissant de dépense, puis alphabétiquement.</p>
<p>Le code en C# 2.0 pourrait être le suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">List&lt;Client&gt; copyClients = new List&lt;Client&gt;(); <br />
copyClients.AddRange(clients); <br />
&nbsp;<br />
copyClients.Sort(delegate(Client x, Client y) <br />
{ <br />
&nbsp; decimal xFacturesSomme = 0, yFacturesSomme = 0; <br />
&nbsp; foreach (Facture facture in x.Factures) <br />
&nbsp; &nbsp; xFacturesSomme += facture.Prix; <br />
&nbsp; foreach (Facture facture in y.Factures) <br />
&nbsp; &nbsp; yFacturesSomme += facture.Prix; <br />
&nbsp; int compareFactureSomme = xFacturesSomme.CompareTo(yFacturesSomme); <br />
&nbsp; if (compareFactureSomme != 0) <br />
&nbsp; &nbsp; return -compareFactureSomme; <br />
&nbsp; int compareNom = x.Nom.CompareTo(y.Nom); <br />
&nbsp; if (compareNom != 0) <br />
&nbsp; &nbsp; return compareNom; <br />
&nbsp; return x.Prenom.CompareTo(y.Prenom); <br />
}); <br />
foreach (Client c in copyClients) <br />
{ <br />
&nbsp; decimal facturesSomme = 0; <br />
&nbsp; foreach (Facture facture in c.Factures) <br />
&nbsp; &nbsp; facturesSomme += facture.Prix; <br />
&nbsp; if (facturesSomme &gt; 50) <br />
&nbsp; &nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, c.Nom, c.Prenom, facturesSomme); <br />
}</div></div>
<p>Avec LINQ, ce code peut être grandement simplifié. Mais attention, on pourrait écrire ceci :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foreach (var statClient in from c in <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(from client in clients <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select new <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Nom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Prenom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TotalDepense = (from f in client.Factures <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select f.Prix).Sum() <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where c.TotalDepense &gt; 50 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orderby c.TotalDepense descending, c.Nom, c.Prenom <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select c) <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, statClient.Nom, statClient.Prenom, statClient.TotalDepense);</div></div>
<p>Cependant, analysons de plus près ce code : </p>
<p>Pour calculer la somme totale dépensée par le client, nous parcourons toutes les factures pour récupérer un IEnumerable sur le prix de celles-ci, puis nous reparcourons cet IEnumerable pour faire la somme.</p>
<p>L&rsquo;idée serait donc de regrouper ces deux boucles en une seule. Pour cela, utilisons une lambda expression et une autre signature de la méthode Sum :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foreach (var statClient in from c in <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(from client in clients <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select new <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Nom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Prenom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TotalDepense = client.Factures.Sum(f =&gt; f.Prix) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where c.TotalDepense &gt; 50 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orderby c.TotalDepense descending, c.Nom, c.Prenom <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select c) <br />
&nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, statClient.Nom, statClient.Prenom, statClient.TotalDepense);</div></div>
<p>L&rsquo;autre problème que l&rsquo;on peut identifier, c&rsquo;est le fait que nous parcourons une première boucle sur les clients pour récupérer un IEnumerable de type anonyme avec le nom, le prénom et la somme dépensée et qu&rsquo;ensuite, nous reparcourons cet IEnumerable pour les trier. Effectivement, pour pouvoir trier par la somme dépensée, il faut au préalable l&rsquo;avoir calculée.</p>
<p>Là encore, une meilleure utilisation de LINQ pourrait nous permettre d&rsquo;optimiser cela :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foreach (var statClient in from c in clients <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalDepense = c.Factures.Sum(f =&gt; f.Prix) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where totalDepense &gt; 50 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orderby totalDepense descending, c.Nom, c.Prenom <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select new <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.Nom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.Prenom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TotalDepense = totalDepense <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}) <br />
&nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, statClient.Nom, statClient.Prenom, statClient.TotalDepense);</div></div>
<p>Via ce post, je cherche à démontrer deux choses :<br />
<b>la requête LINQ est beaucoup plus simple et claire que le code C# 2.0.<br />
une mauvaise connaissance de LINQ peut engendrer des pertes de performances importantes.</b></p>
<p>En revanche, avec LINQ To SQL, même si je ne vous conseille bien entendu pas d&rsquo;écrire de &laquo;&nbsp;mauvaises&nbsp;&raquo; requêtes, la requête SQL générée est optimisée. Dans les trois cas précédents, la requête sera la suivante :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT [t2].[Nom], [t2].[Prenom], [t2].[value] AS [TotalDepense] <br />
FROM ( <br />
&nbsp; SELECT [t0].[Nom], [t0].[Prenom], ( <br />
&nbsp; &nbsp; SELECT SUM([t1].[Prix]) <br />
&nbsp; &nbsp; FROM [dbo].[Facture] AS [t1] <br />
&nbsp; &nbsp; WHERE [t1].[Client] = [t0].[Id] <br />
&nbsp; ) AS [value] <br />
&nbsp; FROM [dbo].[Client] AS [t0] <br />
&nbsp; ) AS [t2] <br />
WHERE [t2].[value] &gt; @p0 <br />
ORDER BY [t2].[value] DESC, [t2].[Nom], [t2].[Prenom]</div></div>
<p>Le risque lié à une mauvaise connaissance de LINQ peut cependant être fortement réduit avec une formation (<a href="http://www.winwise.fr/formation/Presentation-de-LINQ-W095.aspx">http://www.winwise.fr/formation/Presentation-de-LINQ-W095.aspx</a> par exemple).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS 2008 sortie fin novembre</title>
		<link>https://blog.developpez.com/matthieu/p4487/tools/vs_2008_sortie_fin_novembre</link>
		<comments>https://blog.developpez.com/matthieu/p4487/tools/vs_2008_sortie_fin_novembre#comments</comments>
		<pubDate>Mon, 05 Nov 2007 22:33:25 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C&#8217;est officiel, VS 2008 sortira fin novembre. Que du bonheur en perspective]]></description>
				<content:encoded><![CDATA[<p><a href="http://blogs.msdn.com/somasegar/archive/2007/11/05/teched-developer-in-europe.aspx">C&rsquo;est officiel, VS 2008 sortira fin novembre</a>. Que du bonheur en perspective <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS 2008 Beta 2 &#8211; En attendant la RTM</title>
		<link>https://blog.developpez.com/matthieu/p4486/tools/vs_2008_beta_2_en_attendant_la_rtm</link>
		<comments>https://blog.developpez.com/matthieu/p4486/tools/vs_2008_beta_2_en_attendant_la_rtm#comments</comments>
		<pubDate>Sat, 03 Nov 2007 22:22:53 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Si vous utilisez la Beta 2, vous avez sûrement eu le même problème que moi : la version expire au 1er novembre Il faut retélécharger les images pour ne plus avoir de limitation.]]></description>
				<content:encoded><![CDATA[<p>Si vous utilisez la Beta 2, vous avez sûrement eu le même problème que moi : la version expire au 1er novembre <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /><br />
<a href="http://blogs.msdn.com/jeffbe/archive/2007/10/30/vs2008-beta2-vpcs-re-released.aspx">Il faut retélécharger les images pour ne plus avoir de limitation</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Update LINQ To SQL : toutes les colonnes, non pas forcément</title>
		<link>https://blog.developpez.com/matthieu/p4449/net/update_linq_to_sql_toutes_les_colonnes_n</link>
		<comments>https://blog.developpez.com/matthieu/p4449/net/update_linq_to_sql_toutes_les_colonnes_n#comments</comments>
		<pubDate>Sun, 28 Oct 2007 19:05:31 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ADO .Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;avais blogué sur le fait que le Update de LINQ To SQL se faisait sur toutes les colonnes, y compris celles qui n&#8217;ont pas changés, ce qui peut poser des problèmes si vous avez des triggers sur le update de la table SQL. En réalité, j&#8217;avais bloggué un peu vite. En effet, de même qu&#8217;il est possible de ne charger des colonnes qu&#8217;au moment de l&#8217;utilisation de la propriété associée (Delay Loaded = true) avec [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.developpez.com/index.php?blog=121&amp;title=update_de_linq_to_sql_toutes_les_colonne&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">J&rsquo;avais blogué sur le fait que le Update de LINQ To SQL se faisait sur toutes les colonnes, y compris celles qui n&rsquo;ont pas changés, ce qui peut poser des problèmes si vous avez des triggers sur le update de la table SQL</a>.<br />
En réalité, j&rsquo;avais bloggué un peu vite. En effet, de même qu&rsquo;il est possible de ne charger des colonnes qu&rsquo;au moment de l&rsquo;utilisation de la propriété associée (Delay Loaded = true) avec <code class="codecolorer text default"><span class="text">System.Data.Linq.Link&lt;T&gt;</span></code>, il est possible de ne pas inclure une colonne à l&rsquo;update si celle-ci n&rsquo;a pas été modifiée avec l&rsquo;attribut <code class="codecolorer text default"><span class="text">UpdateCheck=UpdateCheck.WhenChanged</span></code>.</p>
<p>Vous pouvez retrouver Delay Loaded et Update Check dans la property grid du designer LINQ To SQL.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment récupérer le context depuis un IQueryable&lt;T&gt;</title>
		<link>https://blog.developpez.com/matthieu/p4416/net/comment_recuperer_le_context_depuis_un_i</link>
		<comments>https://blog.developpez.com/matthieu/p4416/net/comment_recuperer_le_context_depuis_un_i#comments</comments>
		<pubDate>Fri, 19 Oct 2007 23:32:20 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ADO .Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Imaginons le cas suivant : J&#8217;ai une instance vers un IQueryable d&#8217;entities (exactement un System.Data.Linq.DataQuery) mais je n&#8217;ai plus de référence vers le context utilisé pour créer la requête. En parcourant les éléments de mon IQueryable&#60;T&#62;, je peux les modifier. Ensuite, il ma faut appeler la méthode SubmitChanges() sur le context pour que ces modifications soient persistantes en base. Or, comme je l&#8217;ai dit, je n&#8217;ai plus de référence sur le contexte. La seule solution [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Imaginons le cas suivant :<br />
J&rsquo;ai une instance vers un IQueryable d&rsquo;entities (exactement un System.Data.Linq.DataQuery) mais je n&rsquo;ai plus de référence vers le context utilisé pour créer la requête. En parcourant les éléments de mon IQueryable&lt;T&gt;, je peux les modifier. Ensuite, il ma faut appeler la méthode SubmitChanges() sur le context pour que ces modifications soient persistantes en base.<br />
Or, comme je l&rsquo;ai dit, je n&rsquo;ai plus de référence sur le contexte.<br />
La seule solution que j&rsquo;ai trouvé est la suivante : passé par la reflexion pour accéder à un champ privé d&rsquo;une classe internal au Framework (System.Data.Linq.DataQuery) et récupérer ainsi le DataContext :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var qDb = (DataClasses1DataContext)(q.GetType().GetField(&quot;context&quot;, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(q)); <br />
qDb.SubmitChanges();</div></div>
<p>Cela marche effectivement avec les Table<T> mais pour les EntitySet<T>, cela est plus compliqué. On peut supposait que T est un Table<T> et par conséquent, récupérer le context par reflexion mais la seule contrainte sur T est que ce soit une classe : </p>
<p><code class="codecolorer text default"><span class="text">public sealed class EntitySet&lt;TEntity&gt; : IList, ICollection, IList&lt;TEntity&gt;, ICollection&lt;TEntity&gt;, IEnumerable&lt;TEntity&gt;, IEnumerable, IListSource, IEntitySet where TEntity: class</span></code></p>
<p>Donc en gros, ne perdez pas de référence sur un DataContext si vous gardez une référence vers une query.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OnValidate</title>
		<link>https://blog.developpez.com/matthieu/p4430/net/onvalidate</link>
		<comments>https://blog.developpez.com/matthieu/p4430/net/onvalidate#comments</comments>
		<pubDate>Wed, 24 Oct 2007 22:01:02 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ADO .Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je viens d&#8217;avoir une énorme surprise en regardant de plus près le code généré par le designer de LINQ To SQL. Dans chaque classe d&#8217;entité, il y a une partial method OnValidate. Cependant cette méthode n&#8217;est jamais appelée ! En fait si, elle est appelée par la classe ChangeProcessor, dans la méthode ValidateAll&#8230; par reflexion !!!]]></description>
				<content:encoded><![CDATA[<p>Je viens d&rsquo;avoir une énorme surprise en regardant de plus près le code généré par le designer de LINQ To SQL.<br />
Dans chaque classe d&rsquo;entité, il y a une partial method OnValidate. Cependant cette méthode n&rsquo;est jamais appelée ! En fait si, elle est appelée par la classe ChangeProcessor, dans la méthode ValidateAll&#8230; par reflexion !!!</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bien comprendre les bases de LINQ To Objects</title>
		<link>https://blog.developpez.com/matthieu/p4422/net/bien_comprendre_les_bases_de_linq_to_obj</link>
		<comments>https://blog.developpez.com/matthieu/p4422/net/bien_comprendre_les_bases_de_linq_to_obj#comments</comments>
		<pubDate>Mon, 22 Oct 2007 07:39:50 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IL]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Frédéric Mélantois vient de publier son article &#171;&#160;Bien comprendre les bases de LINQ To Objects&#160;&#187;]]></description>
				<content:encoded><![CDATA[<p><a href="http://blogs.codes-sources.com/tkfe/">Frédéric Mélantois</a> vient de publier son <a href="http://www.techheadbrothers.com/Articles.aspx/comprendre-bases-linq-to-objects">article &laquo;&nbsp;Bien comprendre les bases de LINQ To Objects&nbsp;&raquo;</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Update de LINQ To SQL : Toutes les colonnes :(</title>
		<link>https://blog.developpez.com/matthieu/p4410/net/update_de_linq_to_sql_toutes_les_colonne</link>
		<comments>https://blog.developpez.com/matthieu/p4410/net/update_de_linq_to_sql_toutes_les_colonne#comments</comments>
		<pubDate>Thu, 18 Oct 2007 23:01:31 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ADO .Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;avais précédemment blogué sur mon regret que le Update du SQLDataAdapter généré par le designer de DataSet faisait un Update sur toutes les colonnes, y compris celles qui n&#8217;avaient pas été modifié. C&#8217;est pareil avec LINQ To SQL]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.developpez.com/index.php?blog=121&amp;title=argggggggggg_les_sqldataadapter_genere_v&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">J&rsquo;avais précédemment blogué sur mon regret que le Update du SQLDataAdapter généré par le designer de DataSet faisait un Update sur toutes les colonnes, y compris celles qui n&rsquo;avaient pas été modifié</a>.<br />
C&rsquo;est pareil avec LINQ To SQL <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.Net 3.5, quelles sont les nouveautés</title>
		<link>https://blog.developpez.com/matthieu/p4409/net/net_3_5_quelles_sont_les_nouveautes</link>
		<comments>https://blog.developpez.com/matthieu/p4409/net/net_3_5_quelles_sont_les_nouveautes#comments</comments>
		<pubDate>Thu, 18 Oct 2007 15:09:34 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je viens de tomber vraiment par hasard sur un excellent article de Grégory Renard qui reprend l&#8217;ensemble des nouveautés de .NET 3.5.]]></description>
				<content:encoded><![CDATA[<p>Je viens de tomber vraiment par hasard sur <a href="http://www.asp-php.net/tutorial/asp.net/linq-2.php">un excellent article</a> de <a href="http://blogs.developpeur.org/redo/">Grégory Renard</a> qui reprend l&rsquo;ensemble des nouveautés de .NET 3.5.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
