<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Expressions Trees on MemoryLeak</title><link>https://blog.memoryleak.ovh/tags/expressions-trees/</link><description>Recent content in Expressions Trees on MemoryLeak</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Tue, 03 Apr 2018 21:43:43 +0000</lastBuildDate><atom:link href="https://blog.memoryleak.ovh/tags/expressions-trees/index.xml" rel="self" type="application/rss+xml"/><item><title>Combiner des Expressions Trees</title><link>https://blog.memoryleak.ovh/posts/combiner-des-expressions-trees/</link><pubDate>Tue, 03 Apr 2018 21:43:43 +0000</pubDate><guid>https://blog.memoryleak.ovh/posts/combiner-des-expressions-trees/</guid><description>&lt;p&gt;Il y a tout juste quelques jours, on pair programmait avec &lt;a href="https://fr.linkedin.com/in/hocquet" target="_blank"&gt;Anthony&lt;/a&gt; sur un projet. Nous nous sommes retrouvés a vouloir combiner au runtime des &lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/" target="_blank"&gt;Expressions trees&lt;/a&gt; en fonction de parametres évalués au runtime.&lt;/p&gt;
&lt;p&gt;En gros on avait envie d&amp;rsquo;écrire un truc du genre&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Expression predicate = x =&amp;gt; x.Id &amp;gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;puis un peu plus loin&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate += x =&amp;gt; x.Name.Length sexy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Pour faire plaisir à [maitre Etienne](https://twitter.com/EjDel?lang=fr) on va travailler a base de tests unitaires.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Commençons par la version naïve; En cherchant un peu sur la msdn on tombera facilement sur [Expression.AndAlso](https://msdn.microsoft.com/fr-fr/library/bb382914(v=vs.110).aspx) permettant de créer une nouvelle expression qui combine deux Expressions left et right
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt; [Fact]
 public void SimpleCombining_Fails()
 {
 // Arrange
 Expression firstPredicate = x =&amp;gt; x.Id &amp;gt; 1;
 Expression secondPredicate = x =&amp;gt; x.Name.Length lambda = Expression.Lambda(binaryexp, parameters);
 
 // Act
 Action filter = () =&amp;gt; {
 var combinedPredicate = lambda.Compile();
 var result = _persons.Where(combinedPredicate);
 };

 // Assert
 Assert.Throws(() =&amp;gt; filter());
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;On commence par définir nos deux prédicats (left &amp;amp; right) que l&amp;#39;on combine dans une expression binaire AndAlso (et logique) en utilisant comme paramètre générique T le paramètre utilisé dans la premiere expression initiale.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;On essaye par la suite d&amp;#39;utiliser la lambda créée pour l&amp;#39;occasion dans une instruction [Where](https://msdn.microsoft.com/fr-fr/library/bb549418(v=vs.110).aspx) que vous connaissez tous en Linq.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Bon, j&amp;#39;avais déjà vendu la méche en disant que c&amp;#39;était une version naïve; effectivement a l&amp;#39;execution vous allez avoir une [InvalidOperationException](https://msdn.microsoft.com/fr-fr/library/system.invalidoperationexception(v=vs.110).aspx)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;System.InvalidOperationException: &amp;lsquo;variable &amp;lsquo;x&amp;rsquo; of type &amp;lsquo;AndOrExpressions.Person&amp;rsquo; referenced from scope &amp;lsquo;&amp;rsquo;, but it is not defined&amp;rsquo;&lt;/p&gt;</description></item></channel></rss>