{"id":62,"date":"2020-03-04T10:24:00","date_gmt":"2020-03-04T10:24:00","guid":{"rendered":"https:\/\/www.mainmind.com\/blog\/?p=62"},"modified":"2022-12-13T22:51:30","modified_gmt":"2022-12-13T22:51:30","slug":"funciones-personalizadas-en-expresiones-linq","status":"publish","type":"post","link":"https:\/\/www.mainmind.com\/blog\/funciones-personalizadas-en-expresiones-linq\/","title":{"rendered":"Funciones personalizadas en expresiones LINQ"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En las \u00faltimas versiones de Entity Framework&nbsp;ciertos m\u00e9todos que antes si eran aceptados, como tambi\u00e9n se pod\u00eda realizar en SQL, han dejado de estar disponibles. Aquellas funciones heredadas directamente de SQL han quedado <a rel=\"noopener noreferrer\" href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.data.objects.sqlclient.sqlfunctions?redirectedfrom=MSDN&amp;view=netframework-4.8\" target=\"_blank\">englobadas en la misma clase<\/a>. Algo que antes era habitual pero no precisamente una buena forma de solucionar&#8230; las conversiones de tipos de datos, \u00bfquien no ha convertido un string en entero en SQL?<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nLINQ to Entities does not recognize the method &#039;XXXXXXX&#039; method, and this method cannot be translated into a store expression\n<\/pre><\/div>\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Si hablamos con propiedad y utilizando todo el potencial de los ORM no es una buena pr\u00e1ctica, debemos revisar y guardar los datos con el tipo m\u00e1s apropiado, pero si nos vemos forzados a utilizarlas&#8230; podemos personalizar funciones dentro de nuestro modelo de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abrimos nuestro EDMX y definimos la funci\u00f3n:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n    &lt;edmx:ConceptualModels&gt;\n      &lt;Schema Namespace=&quot;NombreDeMiModelo&quot; Alias=&quot;Self&quot; annotation:UseStrongSpatialTypes=&quot;false&quot; xmlns:annotation=&quot;http:\/\/schemas.microsoft.com\/ado\/2009\/02\/edm\/annotation&quot; xmlns:customannotation=&quot;http:\/\/schemas.microsoft.com\/ado\/2013\/11\/edm\/customannotation&quot; xmlns=&quot;http:\/\/schemas.microsoft.com\/ado\/2009\/11\/edm&quot;&gt;\n        &lt;Function Name=&quot;convertirDouble&quot; ReturnType=&quot;Edm.Double&quot;&gt; \n        &lt;Parameter Name=&quot;stringvalue&quot; Type=&quot;Edm.String&quot; \/&gt; \n        &lt;DefiningExpression&gt; \n            cast(stringvalue as Edm.Double)\n        &lt;\/DefiningExpression&gt; \n        &lt;\/Function&gt;\n...\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Definimos en nuestra clase la funci\u00f3n:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing System;\nusing System.Data.Entity;\nusing System.Data.Objects.DataClasses;\n\npublic partial class MiModeloContext\n{\n    \/\/\/ &lt;summary&gt;\n    \/\/\/     Este m\u00e9todo existe para poder ser usando dentro de expresiones LINQ\n    \/\/\/     convierte un texto en n\u00famero (Double)\n    \/\/\/ &lt;\/summary&gt;\n\n    &#x5B;DbFunction(&quot;NombreDeMiModelo&quot;, &quot;convertirDouble&quot;)]\n    public static double convertirDouble(string stringvalue)\n    {\n        return Double.Parse(stringvalue);\n    }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ya podemos utilizar la funci\u00f3n dentro de las expresiones:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndatos = miEntidad.miDato.Where(x =&gt; SqlFunctions.IsNumeric(x.aux) &gt; 0 &amp;&amp;\nMiModeloContext.ParseDouble(x.aux) &gt; numero)\n.FirstOrDefault();\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aunque deberemos revisar si realmente nuestro modelo de datos es coherente&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Referencia: <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/framework\/data\/adonet\/ef\/language-reference\/calling-functions-in-linq-to-entities-queries\" target=\"_blank\" rel=\"noopener noreferrer\">Calling Functions in LINQ to Entities Queries<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En las \u00faltimas versiones de Entity Framework&nbsp;ciertos m\u00e9todos que antes si eran aceptados, como tambi\u00e9n se pod\u00eda realizar en SQL, han dejado de estar disponibles. Aquellas funciones heredadas directamente de SQL han quedado englobadas en la misma clase. Algo que antes era habitual pero no precisamente una buena forma de solucionar&#8230; las conversiones de tipos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1754,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[80,76,78,79,77],"class_list":["post-62","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bases-de-datos","tag-bbdd","tag-custom","tag-funciones","tag-linq","tag-personalizada"],"_links":{"self":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/62","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/comments?post=62"}],"version-history":[{"count":0,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/62\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/media\/1754"}],"wp:attachment":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/media?parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/categories?post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/tags?post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}