{"id":446,"date":"2017-03-10T09:48:51","date_gmt":"2017-03-10T09:48:51","guid":{"rendered":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?p=446"},"modified":"2017-03-10T10:30:34","modified_gmt":"2017-03-10T10:30:34","slug":"expression-visitor-para-consultas-dinamicas-en-entity-framework","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/","title":{"rendered":"ExpressionVisitor para consultas din\u00e1micas en Entity framework"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-451 size-full\" title=\"Expression Visitor para consultas dinamicas en Entity framework\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png\" alt=\"Expression Visitor para consultas dinamicas en Entity framework\" width=\"921\" height=\"517\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png 921w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor-300x168.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor-768x431.png 768w\" sizes=\"auto, (max-width: 921px) 100vw, 921px\" \/><\/p>\n<p>En nuestros desarrollos, a menudo necesitamos construir <strong>expresiones LINQ<\/strong> de forma din\u00e1mica. Puede ser que, por ejemplo, una de nuestras aplicaciones web tenga un sistema de b\u00fasqueda complejo o que necesitemos aplicar filtros din\u00e1micos a un conjunto de datos usando Entity Framework.<\/p>\n<p>Este dinamismo en nuestras consultas se puede conseguir de diversas maneras, pero una de las m\u00e1s elegantes es utilizar <strong>ExpressionVisitor.<\/strong><\/p>\n<p><!--more--><\/p>\n<p>Tambi\u00e9n existe la posibilidad de descargar el NuGET de <a href=\"https:\/\/www.nuget.org\/packages\/LinqKit\/\">LinqKit<\/a> o el <i>Predica<\/i><i>teBuilder <\/i>de <a href=\"https:\/\/www.nuget.org\/packages\/Binbin.Linq.PredicateBuilder\/\">BinBin.Linq<\/a>, pero a\u00f1adir librer\u00eda de terceros no es siempre una opci\u00f3n. Adem\u00e1s, aplicando nuestra propia implementaci\u00f3n, podemos tener un control total sobre todo el c\u00f3digo que hay en nuestros sistemas.<\/p>\n<h2>\u00bfQu\u00e9 es ExpressionVisitor?<\/h2>\n<p><strong>ExpressionVisitor<\/strong> es una clase introducida en la <strong>versi\u00f3n 4.0 de .NET Framework<\/strong> que nos permite <strong>aplicar el patr\u00f3n <i>visitor<\/i> a nuestras expresiones LINQ.<\/strong> Esto nos permite dinamizar mucho nuestras consultas a base de datos utilizando, por ejemplo, EntityFramework.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-454 alignleft\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/Expression_Visitor-1.png\" alt=\"Expression_Visitor\" width=\"324\" height=\"331\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/Expression_Visitor-1.png 629w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/Expression_Visitor-1-294x300.png 294w\" sizes=\"auto, (max-width: 324px) 100vw, 324px\" \/>El<strong> patr\u00f3n <i>visitor<\/i><\/strong>, explicado de forma muy simple, no es m\u00e1s que una forma de separar la l\u00f3gica de nuestros algoritmos de la estructura de datos sobre la que se aplican. En nuestro caso, la estructura de datos es el \u00e1rbol de expresiones y los algoritmos, por ejemplo, ser\u00e1n los m\u00e9todos que utilicemos para modificar dichas expresiones.<\/p>\n<p>No vamos a entrar en m\u00e1s detalle sobre el patr\u00f3n, ya que ser\u00eda necesario un post completo s\u00f3lo para ello. Adem\u00e1s, hay muchas y muy buenas explicaciones del mismo por las redes (<a href=\"https:\/\/www.exceptionnotfound.net\/visitor-the-daily-design-pattern\/\">esta<\/a>, por ejemplo).<\/p>\n<h3><\/h3>\n<p>&nbsp;<\/p>\n<h3>Ejemplo<\/h3>\n<p>Somos los responsables de crear una aplicaci\u00f3n para gestionar los pagos que recibe una empresa y el cliente nos pide una pantalla en la que se muestren los pagos que han realizado una serie de personas, que identificaremos con el NIF, en fechas concretas. Tenemos una clase <i>Payment<\/i> como la siguiente:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic class Payment\r\n{\r\n    public string Nif { get; set;}\r\n    public DateTime PaymentDate { get; set;}\r\n    public decimal Amount { get; set; }\r\n}\r\n<\/pre>\n<p>Adem\u00e1s, disponemos de un diccionario que nos proporciona la relaci\u00f3n persona-fecha de pago que nos interesa. Este diccionario no ser\u00eda fijo, sino que vendr\u00eda de alg\u00fan servicio externo y podr\u00eda tener cientos de entradas.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nvar nifWithPaymentDate = new Dictionary&lt;string, DateTime&gt;\r\n{\r\n    &#x5B;&quot;00000000T&quot;] = new DateTime(2001, 10, 6),\r\n    &#x5B;&quot;99999999R&quot;] = new DateTime(2012, 4, 2)\r\n}\r\n<\/pre>\n<p>\u00bfC\u00f3mo construimos din\u00e1micamente una expresi\u00f3n LINQ que nos permita obtener los datos que queremos sin hacer <i>n<\/i> consultas? Veamos el <i>ExpressionVisitor<\/i>.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ Heredamos de ExpressionVisitor\r\npublic class ReplaceExpressionVisitor : ExpressionVisitor\r\n{\r\n\r\n    private readonly Expression oldValue;\r\n    private readonly Expression newValue;\r\n\r\n    public MyExpressionVisitor(Expression oldValue, Expression newValue)\r\n    {\r\n        this.oldValue = oldValue;\r\n        this.newValue = newValue;\r\n    }\r\n\r\n    \/\/ Implementaci\u00f3n del m\u00e9todo Visit\r\n    public override Expression Visit(Expression node)\r\n    {\r\n        \/\/ Si la expresi\u00f3n a visitar es igual a la antigua reemplazamos\r\n        return node == this.oldValue ? this.newValue : base.Visit(node);\r\n    }\r\n}\r\n<\/pre>\n<p>Como se puede apreciar, simplemente tenemos que heredar de <i>ExpressionVisitor<\/i> para poder utilizar lo que nos aporta. Esta implementaci\u00f3n simplemente reemplazar\u00e1 la expresi\u00f3n pasada como <i>oldValue<\/i> por la que se pase como <i>newValue<\/i>.<\/p>\n<p>Por otro lado, para construir nuestra expresi\u00f3n din\u00e1micamente, tambi\u00e9n necesitaremos un m\u00e9todo de extensi\u00f3n para las consultas con LINQ a EntityFramework para llamar a nuestro <i>ReplaceExpressionVisitor<\/i>.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic static Expression&lt;Func&lt;T, bool&gt;&gt; Or&lt;T&gt;(\r\n    this Expression&lt;Func&lt;T, bool&gt;&gt; expr1,\r\n    Expression&lt;Func&lt;T, bool&gt;&gt; expr2)\r\n{\r\n\r\n    \/\/ Obtenemos el tipo de par\u00e1metro T de nuestras expresiones\r\n    var parameter = Expression.Parameter(typeof(T));\r\n\r\n    \/\/ Instanciamos un visitor para expr1\r\n    var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters&#x5B;0], parameter);\r\n\r\n    \/\/ Visitamos la expresi\u00f3n\r\n    var left = leftVisitor.Visit(expr1.Body);\r\n\r\n    \/\/ Instanciamos un visitor para expr1\r\n    var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters&#x5B;0], parameter);\r\n\r\n    \/\/ Visitamos la expresi\u00f3n\r\n    var right = rightVisitor.Visit(expr2.Body);\r\n\r\n    \/\/ Devolvemos la lambda resultado\r\n    return Expression.Lambda&lt;Func&lt;T, bool&gt;&gt;(\r\n        Expression.OrElse(left, right), parameter);\r\n<\/pre>\n<p>Este m\u00e9todo tiene algo m\u00e1s de miga. Como vemos, visitamos ambas expresiones para reemplazar el par\u00e1metro origen T por los par\u00e1metros suministrados por cada una de las expresiones. Con esto listo, construimos una nueva lambda combinando las expresiones visitadas con <i>OrElse<\/i> y la devolvemos.<\/p>\n<p>Ahora veamos c\u00f3mo funciona todo esto en conjunto.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nIQueryable&lt;Payment&gt; paymentsFromDb = db.Payments;\r\n\r\n\/\/ Inicializamos a false por defecto\r\nExpression&lt;Func&lt;Payment, bool&gt;&gt; theExpression = p =&gt; false;\r\n\r\n\/\/ Iteramos sobre el diccionario\r\nforeach (var paymentInfo in nifWithPaymentDate)\r\n{\r\n    \/\/ Por cada una de las entradas del diccionario\r\n    \/\/ Construimos din\u00e1micamente la consulta\r\n    theExpression = theExpression\r\n        .Or(p =&gt; p.Nif == paymentInfo.Key &amp;&amp; p.PaymentDate == paymentInfo.Value);\r\n}\r\n\r\n\/\/ Pasamos la expresi\u00f3n resultante a un Where\r\nvar result = paymentsFromDb.Where(theExpression.ToList();\r\n<\/pre>\n<p>F\u00e1cil, \u00bfverdad? Simplemente iteramos sobre el diccionario con los datos externos para construir una expresi\u00f3n a partir de una base. En cada iteracci\u00f3n vamos acumulando condiciones <i>Or<\/i> con el m\u00e9todo de extensi\u00f3n que aplica nuestro <i>ExpressionVisitor<\/i>. Posteriormente s\u00f3lo nos queda pasar dicha expresi\u00f3n a Entity Framework para hacer la consulta.<\/p>\n<h2>Resumen<\/h2>\n<p>Utilizar<strong> ExpressionVisitor<\/strong> es una forma genial y elegante de crear expresiones LINQ de forma din\u00e1mica. Siguiendo con Entity Framework, podr\u00edamos combinarlo con un QueryInterceptor para a\u00f1adir condiciones fijas a todas nuestras consultas. Esto podr\u00eda ser \u00fatil para borrados l\u00f3gicos, por ejemplo, ayud\u00e1ndonos a evitar tener que a\u00f1adir la condici\u00f3n que comprueba dicho borrado en cada expresi\u00f3n.<\/p>\n<p>En conclusi\u00f3n, la capacidad de aplicar el patr\u00f3n <i>visitor<\/i> a \u00e1rboles de expresiones nos ofrece un grado m\u00e1s de dinamismo y versatilidad a la hora de trabajar con LINQ.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>En nuestros desarrollos, a menudo necesitamos construir expresiones LINQ de forma din\u00e1mica. Puede ser que, por ejemplo, una de nuestras aplicaciones web tenga un sistema de b\u00fasqueda complejo o que necesitemos aplicar filtros din\u00e1micos a un conjunto de datos usando &hellip; <a href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":126,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[71,72],"class_list":["post-446","post","type-post","status-publish","format-standard","hentry","category-net","tag-expressionvisitor","tag-linq"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>ExpressionVisitor para consultas din\u00e1micas en Entity framework - Piensa en software, desarrolla en colores<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ExpressionVisitor para consultas din\u00e1micas en Entity framework\" \/>\n<meta property=\"og:description\" content=\"En nuestros desarrollos, a menudo necesitamos construir expresiones LINQ de forma din\u00e1mica. Puede ser que, por ejemplo, una de nuestras aplicaciones web tenga un sistema de b\u00fasqueda complejo o que necesitemos aplicar filtros din\u00e1micos a un conjunto de datos usando &hellip; Continue reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/\" \/>\n<meta property=\"og:site_name\" content=\"Piensa en software, desarrolla en colores\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-10T09:48:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-03-10T10:30:34+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png\" \/>\n<meta name=\"author\" content=\"Juan Carlos Mart\u00ednez Garc\u00eda\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jcmartinezg23\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Juan Carlos Mart\u00ednez Garc\u00eda\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/\"},\"author\":{\"name\":\"Juan Carlos Mart\u00ednez Garc\u00eda\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/979c86ed9d5e671c262ed57b80f5bf44\"},\"headline\":\"ExpressionVisitor para consultas din\u00e1micas en Entity framework\",\"datePublished\":\"2017-03-10T09:48:51+00:00\",\"dateModified\":\"2017-03-10T10:30:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/\"},\"wordCount\":980,\"commentCount\":2,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/03\\\/EXpression-Visitor.png\",\"keywords\":[\"ExpressionVisitor\",\"LINQ\"],\"articleSection\":[\".NET\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/\",\"name\":\"ExpressionVisitor para consultas din\u00e1micas en Entity framework - Piensa en software, desarrolla en colores\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/03\\\/EXpression-Visitor.png\",\"datePublished\":\"2017-03-10T09:48:51+00:00\",\"dateModified\":\"2017-03-10T10:30:34+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/979c86ed9d5e671c262ed57b80f5bf44\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/expression-visitor-para-consultas-dinamicas-en-entity-framework\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/03\\\/EXpression-Visitor.png\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/03\\\/EXpression-Visitor.png\",\"width\":921,\"height\":517},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/\",\"name\":\"Piensa en software, desarrolla en colores\",\"description\":\"Las ventajas que te ofrece Microsoft Azure y el mundo.NET\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/979c86ed9d5e671c262ed57b80f5bf44\",\"name\":\"Juan Carlos Mart\u00ednez Garc\u00eda\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g\",\"caption\":\"Juan Carlos Mart\u00ednez Garc\u00eda\"},\"description\":\"Trabajo con tecnolog\u00eda Microsoft, especialmente NET Core y Azure, adem\u00e1s de con el stack de Office 365. Estoy certificado como MCSD en Web Applications y App Builder. Me apasiona lo que hay detr\u00e1s de las tecnolog\u00edas que utilizamos los desarrolladores a diario, el c\u00f3digo limpio y desarrollar pensando en colores. Actualmente aplico todo mi buen rollo trabajando como Software &amp; Cloud Architect para ENCAMINA.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/jcmartinezg23\"],\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/author\\\/jcmartinez\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ExpressionVisitor para consultas din\u00e1micas en Entity framework - Piensa en software, desarrolla en colores","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/","og_locale":"es_ES","og_type":"article","og_title":"ExpressionVisitor para consultas din\u00e1micas en Entity framework","og_description":"En nuestros desarrollos, a menudo necesitamos construir expresiones LINQ de forma din\u00e1mica. Puede ser que, por ejemplo, una de nuestras aplicaciones web tenga un sistema de b\u00fasqueda complejo o que necesitemos aplicar filtros din\u00e1micos a un conjunto de datos usando &hellip; Continue reading &rarr;","og_url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/","og_site_name":"Piensa en software, desarrolla en colores","article_published_time":"2017-03-10T09:48:51+00:00","article_modified_time":"2017-03-10T10:30:34+00:00","og_image":[{"url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png","type":"","width":"","height":""}],"author":"Juan Carlos Mart\u00ednez Garc\u00eda","twitter_card":"summary_large_image","twitter_creator":"@jcmartinezg23","twitter_misc":{"Escrito por":"Juan Carlos Mart\u00ednez Garc\u00eda","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/"},"author":{"name":"Juan Carlos Mart\u00ednez Garc\u00eda","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/979c86ed9d5e671c262ed57b80f5bf44"},"headline":"ExpressionVisitor para consultas din\u00e1micas en Entity framework","datePublished":"2017-03-10T09:48:51+00:00","dateModified":"2017-03-10T10:30:34+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/"},"wordCount":980,"commentCount":2,"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png","keywords":["ExpressionVisitor","LINQ"],"articleSection":[".NET"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/","name":"ExpressionVisitor para consultas din\u00e1micas en Entity framework - Piensa en software, desarrolla en colores","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png","datePublished":"2017-03-10T09:48:51+00:00","dateModified":"2017-03-10T10:30:34+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/979c86ed9d5e671c262ed57b80f5bf44"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/expression-visitor-para-consultas-dinamicas-en-entity-framework\/#primaryimage","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png","contentUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/03\/EXpression-Visitor.png","width":921,"height":517},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/","name":"Piensa en software, desarrolla en colores","description":"Las ventajas que te ofrece Microsoft Azure y el mundo.NET","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/979c86ed9d5e671c262ed57b80f5bf44","name":"Juan Carlos Mart\u00ednez Garc\u00eda","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g","caption":"Juan Carlos Mart\u00ednez Garc\u00eda"},"description":"Trabajo con tecnolog\u00eda Microsoft, especialmente NET Core y Azure, adem\u00e1s de con el stack de Office 365. Estoy certificado como MCSD en Web Applications y App Builder. Me apasiona lo que hay detr\u00e1s de las tecnolog\u00edas que utilizamos los desarrolladores a diario, el c\u00f3digo limpio y desarrollar pensando en colores. Actualmente aplico todo mi buen rollo trabajando como Software &amp; Cloud Architect para ENCAMINA.","sameAs":["https:\/\/x.com\/jcmartinezg23"],"url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/author\/jcmartinez\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/446","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/users\/126"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/comments?post=446"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/446\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media?parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/categories?post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/tags?post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}