{"id":2267,"date":"2016-05-18T14:32:38","date_gmt":"2016-05-18T14:32:38","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2267"},"modified":"2025-10-09T07:07:56","modified_gmt":"2025-10-09T14:07:56","slug":"couchbase-with-windows-net-part-4-linq2couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-net-part-4-linq2couchbase\/","title":{"rendered":"Couchbase con Windows y .NET - Parte 4 - Linq2Couchbase"},"content":{"rendered":"<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-and-.net---part-1\/\">En la Parte 1 se explica c\u00f3mo instalar y configurar Couchbase en Windows.<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-and-.net---part-2\/\">En la Parte 2 se trat\u00f3 algo de la jerga de Couchbase que necesitar\u00e1s conocer<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-and-.net---part-3---asp.net-mvc\/\">La parte 3 mostraba el ejemplo m\u00e1s simple de uso de Couchbase en ASP.NET<\/a><\/li>\n<\/ul>\n<p>En esta entrada del blog, voy a desarrollar la parte 3 presentando <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\">Linq2Base<\/a>. Tambi\u00e9n voy a mover Couchbase fuera del controlador y ponerlo en un muy b\u00e1sico <a href=\"https:\/\/www.martinfowler.com\/eaaCatalog\/repository.html\">repositorio<\/a> clase. Mi objetivo de esta entrada de blog es que te sientas c\u00f3modo con los fundamentos de Couchbase y Linq2Couchbase, y seas capaz de empezar a aplicarlo en tu aplicaci\u00f3n web.<\/p>\n<h2>Mover Couchbase fuera del Controlador<\/h2>\n<p>El trabajo del Controlador es dirigir el tr\u00e1fico: tomar las peticiones entrantes, entregarlas a un modelo, y luego dar los resultados a la vista. Para seguir el <a href=\"https:\/\/www.butunclebob.com\/ArticleS.UncleBob.PrinciplesOfOod\">Principios S\u00d3LIDOS<\/a> (concretamente el Principio de Responsabilidad \u00danica), el acceso a los datos debe estar en alg\u00fan lugar de un \"modelo\" y no en el controlador.<\/p>\n<p>El primer paso es refactorizar el c\u00f3digo existente. Podemos mantener el 'ejemplo realmente simple' de la Parte 3, pero deber\u00eda ser movido a un m\u00e9todo en otra clase. Aqu\u00ed est\u00e1 el HomeController refactorizado y el nuevo PersonRepository:<\/p>\n<pre><code>public class HomeController : Controller\r\n{\r\n    private readonly PersonRepository _personRepo;\r\n\r\n    public HomeController(PersonRepository personRepo)\r\n    {\r\n        _personRepo = personRepo;\r\n    }\r\n\r\n    public ActionResult Index()\r\n    {\r\n        var person = _personRepo.GetPersonByKey(\"foo::123\");\r\n        return Content(\"Name: \" + person.name + \", Address: \" + person.address);\r\n    }\r\n}\r\n\r\npublic class PersonRepository\r\n{\r\n    private readonly IBucket _bucket;\r\n\r\n    public PersonRepository(IBucket bucket)\r\n    {\r\n        _bucket = bucket;\r\n    }\r\n\r\n    public dynamic GetPersonByKey(string key)\r\n    {\r\n        return _bucket.Get(key).Value;\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Algunas cosas a tener en cuenta:<\/p>\n<ul>\n<li>HomeController ya no depende directamente de Couchbase. Si la API de Couchbase cambiara, por ejemplo, s\u00f3lo tendr\u00edamos que hacer cambios en PersonRepository, no en HomeController.<\/li>\n<li>No tuve que decirle expl\u00edcitamente a StructureMap c\u00f3mo instanciar PersonRepository. Se imagina que PersonRepository es \"auto-vinculante\". Si tuviera que utilizar una interfaz en su lugar (como IPersonRepository), tendr\u00eda que hacer un cambio en DefaultRegistry para indic\u00e1rselo a StructureMap. Si est\u00e1s utilizando un contenedor IoC diferente, tu situaci\u00f3n puede ser diferente.<\/li>\n<\/ul>\n<h2>Refactorizaci\u00f3n para utilizar una clase Persona<\/h2>\n<p>En el ejemplo anterior, estoy utilizando un <code>din\u00e1mico<\/code> objeto. <code>din\u00e1mico<\/code> es genial para algunas situaciones, pero en este caso, ser\u00eda una buena idea llegar a una definici\u00f3n m\u00e1s concreta de lo que es una \"Persona\". Puedo hacerlo con una clase C#.<\/p>\n<pre><code>public class Persona\r\n{\r\n    public string Nombre { get; set; }\r\n    public string Direcci\u00f3n { get; set; }\r\n}\r\n<\/code><\/pre>\n<p>Tambi\u00e9n actualizar\u00e9 el PersonRepository para que utilice esta clase.<\/p>\n<pre><code>public Persona GetPersonByKey(cadena clave)\r\n{\r\n    return _bucket.Get(clave).Valor;\r\n}\r\n<\/code><\/pre>\n<p>Mientras estamos en ello, voy a tomar algunas medidas para hacer esto m\u00e1s de una aplicaci\u00f3n MVC adecuada. En lugar de devolver Content(), voy a hacer que la acci\u00f3n Index devuelva una View, y voy a pasarle un m\u00e9todo <em>lista<\/em> de objetos Persona. Crear\u00e9 un archivo Index.cshtml, que delegar\u00e1 en un parcial de _person.cshtml. Tambi\u00e9n voy a dejar caer en un dise\u00f1o que utiliza Bootstrap. Esta \u00faltima parte es completamente gratuita, pero har\u00e1 que las capturas de pantalla se vean un poco m\u00e1s bonitas.<\/p>\n<p>Nueva acci\u00f3n del \u00cdndice:<\/p>\n<pre><code>    public ActionResult Index()\r\n    {\r\n        var person = _personRepo.GetPersonByKey(\"foo::123\");\r\n        var list = new List {person};\r\n        return View(list);\r\n    }\r\n<\/code><\/pre>\n<p>Index.cshtml:<\/p>\n<pre class=\"\">@model List&lt;CouchbaseAspNetExample2.Models.Person&gt;\r\n\r\n@{\r\n ViewBag.Title = &quot;Home : Couchbase &amp; ASP.NET Example&quot;;\r\n}\r\n\r\n@if (!Model.Any())\r\n{\r\n &lt;p&gt;There are no people yet.&lt;\/p&gt;\r\n}\r\n\r\n@foreach (var item in Model)\r\n{\r\n @Html.Partial(&quot;_person&quot;, item)\r\n}\r\n<\/pre>\n<p class=\"\">persona.cshtml:<\/p>\n<pre class=\"\">@model CouchbaseAspNetExample2.Models.Person\r\n&lt;div <span class=\"hljs-keyword\">clase<\/span>=<span class=\"hljs-string\">\"panel panel-default\"<\/span>&gt;\r\n&lt;div <span class=\"hljs-keyword\">clase<\/span>=<span class=\"hljs-string\">\"panel-encabezado\"<\/span>&gt;\r\n&lt;h2 <span class=\"hljs-keyword\">clase<\/span>=<span class=\"hljs-string\">\"panel-title\"<\/span>&gt;@Model.Name&lt;\/h2&gt; \r\n&lt;\/div&gt; \r\n&lt;div <span class=\"hljs-keyword\">clase<\/span>=<span class=\"hljs-string\">\"panel-cuerpo\"<\/span>&gt; \r\n@Html.Raw(Model.Address) \r\n&lt;\/div&gt; \r\n&lt;\/div&gt;<code><\/code><\/pre>\n<div class=\"panel panel-default\">\n<p>&nbsp;<\/p>\n<\/div>\n<p>Ahora se ve un poco mejor. Adem\u00e1s, podremos mostrar toda una lista de documentos Persona m\u00e1s adelante en la demo.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/couchbase-with-windows-.net-part-4-linq2couchbase\/indexofcouchbasedocumentsinbootstrap_001.png\" alt=\"The Index view of Couchbase Person documents in Bootstrap\" \/><\/p>\n<h2>Presentaci\u00f3n de Linq2Couchbase<\/h2>\n<p>Couchbase Server soporta un lenguaje de consulta conocido como <a href=\"https:\/\/www.couchbase.com\/blog\/es\/n1ql\/\">N1QL<\/a>. Es un superconjunto de SQL, y le permite aprovechar su conocimiento existente de SQL para construir consultas muy potentes sobre documentos JSON en Couchbase. Linq2Couchbase va un paso m\u00e1s all\u00e1 y convierte las consultas Linq en consultas N1QL (al igual que Entity Framework convierte las consultas Linq en consultas SQL).<\/p>\n<p>Linq2Couchbase forma parte de <a href=\"https:\/\/github.com\/couchbaselabs\">Laboratorios Couchbase<\/a>y a\u00fan no forma parte de la librer\u00eda principal y soportada del SDK .NET de Couchbase. Sin embargo, si est\u00e1s acostumbrado a Entity Framework, NHibernate.Linq, o cualquier otro proveedor de Linq, es una gran manera de introducirse a Couchbase. Para algunas operaciones, todav\u00eda necesitar\u00e1s usar el n\u00facleo de Couchbase .NET SDK, pero hay mucho que podemos hacer con Linq2Couchbase.<\/p>\n<p>Empieza por a\u00f1adir Linq2Couchbase con NuGet (si a\u00fan no lo has hecho).<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/couchbase-with-windows-.net-part-4-linq2couchbase\/nugetlinq2couchbase_002.png\" alt=\"Install Linq2Couchbase with NuGet\" \/><\/p>\n<p>N1QL (y, por tanto, Linq2Couchbase) depende de la aplicaci\u00f3n <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/n1ql\/n1ql-language-reference\/createprimaryindex.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">cubo indexado<\/a>. Entra en la consola de Couchbase, haz clic en la pesta\u00f1a 'Query' y crea un \u00edndice primario en el archivo <code>hello-couchbase<\/code> cubo.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/couchbase-with-windows-.net-part-4-linq2couchbase\/createprimaryindexoncouchbasebucket_004.png\" alt=\"Create a primary index on a Couchbase bucket\" \/><\/p>\n<p>Si no tienes un \u00edndice, Linq2Couchbase te dar\u00e1 un \u00fatil mensaje de error como \"No primary index on keyspace hello-couchbase. Use CREATE PRIMARY INDEX para crear uno\".<\/p>\n<p>Para utilizar Linq2Couchbase de la forma m\u00e1s eficaz, tenemos que empezar a dar a los documentos de Couchbase un campo de \"tipo\". De esta manera, podemos diferenciar entre un documento de \"persona\" y un documento de \"ubicaci\u00f3n\", por ejemplo. En este ejemplo, s\u00f3lo voy a tener documentos de \"persona\", pero es una buena idea hacer esto desde el principio. Voy a crear un campo Tipo, y establecerlo en \"Persona\". Tambi\u00e9n pondr\u00e9 un atributo en la clase C# para que Linq2Couchbase entienda que esta clase es para un cierto tipo de documento.<\/p>\n<pre><code>using Couchbase.Linq.Filters;\r\n\r\n[DocumentTypeFilter(\"Person\")]\r\npublic class Person\r\n{\r\n    public Person()\r\n    {\r\n        Type = \"Person\";\r\n    }\r\n    public string Type { get; set; }\r\n    public string Name { get; set; } \r\n    public string Address { get; set; }\r\n}\r\n<\/code><\/pre>\n<p>Si realiza estos cambios, su aplicaci\u00f3n seguir\u00e1 funcionando. Esto se debe a que todav\u00eda estamos recuperando el documento por su clave. Pero ahora cambiemos la acci\u00f3n \u00cdndice para intentar obtener TODOS los documentos de Persona.<\/p>\n<pre><code>public ActionResult \u00cdndice()\r\n{\r\n    var list = _personRepo.GetAll();\r\n    return Ver(lista);\r\n}\r\n<\/code><\/pre>\n<p>Necesitaremos implementar ese nuevo m\u00e9todo de repositorio GetAll:<\/p>\n<pre><code>using System.Collections.Generic;\r\nusing System.Linq;\r\nusing Couchbase.Core;\r\nusing Couchbase.Linq;\r\nusing Couchbase.Linq.Extensions;\r\nusing Couchbase.N1QL;\r\n\r\npublic class PersonRepository\r\n{\r\n    private readonly IBucket _bucket;\r\n    private readonly IBucketContext _context;\r\n\r\n    public PersonRepository(IBucket bucket, IBucketContext context)\r\n    {\r\n        _bucket = bucket;\r\n        _context = context;\r\n    }\r\n\r\n    public List GetAll()\r\n    {\r\n        return _context.Query()\r\n           .ScanConsistency(ScanConsistency.RequestPlus)\r\n           .OrderBy(p =&gt; p.Name)\r\n           .ToList();\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>En este ejemplo, le estoy diciendo a Couchbase que ordene todos los resultados por Nombre. Si quieres, puedes experimentar con los m\u00e9todos Linq normales a los que est\u00e1s acostumbrado: Where, Select, Take, Skip, etc.<\/p>\n<p>Ignora la Consistencia de Escaneo por ahora: Hablar\u00e9 de ello m\u00e1s adelante. \u00bfPero qu\u00e9 pasa con ese IBucketContext? El IBucketContext es similar al DbContext de Entity Framework, o al ISession de NHibernate. Para obtener ese IBucketContext, necesitaremos actualizar el DefaultRegistry.<\/p>\n<pre><code>For().Singleton().Use(\"Get a Couchbase Bucket\",\r\n    x =&gt; ClusterHelper.GetBucket(\"hello-couchbase\", \"password!\"));\r\nFor().HttpContextScoped().Use(\"Get a Couchbase Bucket Context\",\r\n    x =&gt; new BucketContext(x.GetInstance()));\r\n<\/code><\/pre>\n<p>Esto le dice a StructureMap que quiero crear un nuevo BucketContext y que quiero que se aplique a cada solicitud HTTP. Si utiliza HttpContextScoped en StructureMap, tambi\u00e9n tendr\u00e1 que utilizar <code>HttpContextLifecycle.DisposeAndClearAll()<\/code> en el Application_EndRequest. Si est\u00e1s utilizando un contenedor IoC diferente, tendr\u00e1s que gestionarlo de forma diferente.<\/p>\n<p>Ahora, si vuelves a compilar y ejecutar la aplicaci\u00f3n web, aparecer\u00e1 el mensaje \"There are no people yet\". Eh, \u00a1\u00bfd\u00f3nde me he metido?! No aparec\u00ed porque el documento \"foo::123\" a\u00fan no tiene un campo \"type\". Ve a la consola de Couchbase y a\u00f1\u00e1delo.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/couchbase-with-windows-.net-part-4-linq2couchbase\/updatecouchbasedocument_003.png\" alt=\"Adding a type field to a Couchbase document\" \/><\/p>\n<p>Una vez hecho esto, actualiza tu p\u00e1gina web y la persona volver\u00e1 a aparecer.<\/p>\n<h2>Nota r\u00e1pida sobre ScanConsistency<\/h2>\n<p>Linq2Couchbase se basa en un \u00edndice para generar y ejecutar consultas. Cuando a\u00f1ades nuevos documentos, el \u00edndice debe ser actualizado. Hasta que el \u00edndice no se actualice, los documentos a\u00fan no indexados no ser\u00e1n devueltos por Linq2Couchbase (por defecto). A\u00f1adiendo en ScanConsistency de RequestPlus (<a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/architecture\/querying-data-with-n1ql.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Consulte la documentaci\u00f3n de Couchbase para obtener m\u00e1s informaci\u00f3n sobre la coherencia del an\u00e1lisis.<\/a>), Linq2Couchbase esperar\u00e1 hasta que el \u00edndice se actualice antes de ejecutar una consulta y devolver una respuesta. Se trata de un compromiso que deber\u00e1s tener en cuenta a la hora de dise\u00f1ar tu aplicaci\u00f3n. \u00bfQu\u00e9 es m\u00e1s importante: la velocidad bruta o la precisi\u00f3n total?<\/p>\n<p>Como ejemplo sencillo, supongamos que est\u00e1 creando un sistema de gesti\u00f3n de contenidos:<\/p>\n<ul>\n<li>Si est\u00e1 creando herramientas de administraci\u00f3n, probablemente valore m\u00e1s la precisi\u00f3n total que el rendimiento.\n<ul>\n<li>Los administradores necesitan saber exactamente qu\u00e9 contienen los datos para poder gestionarlos con eficacia.<\/li>\n<li>Las funciones de administraci\u00f3n se utilizan con poca frecuencia en comparaci\u00f3n con las funciones p\u00fablicas, por lo que es aceptable cierta latencia.<\/li>\n<\/ul>\n<\/li>\n<li>Si est\u00e1s creando una p\u00e1gina p\u00fablica que enumera todo el contenido, la velocidad bruta es probablemente m\u00e1s importante.\n<ul>\n<li>Si una nueva p\u00e1gina de contenido tarda uno o dos segundos m\u00e1s en aparecer al p\u00fablico, no pasa nada.<\/li>\n<li>La parte p\u00fablica de un sitio se visitar\u00e1 con mucha frecuencia, por lo que el rendimiento es un factor importante.<\/li>\n<\/ul>\n<\/li>\n<li>Esto es s\u00f3lo un ejemplo: el tipo de Consistencia de Exploraci\u00f3n que debe utilizar depende de usted y de sus casos de uso.<\/li>\n<\/ul>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Linq2Couchbase es una potente herramienta para trabajar con Couchbase de forma familiar. Es de c\u00f3digo abierto, pero a\u00fan no est\u00e1 soportada oficialmente por Couchbase. He puesto todo el c\u00f3digo de esta entrada de blog a disposici\u00f3n en <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-asp-net-blog-example-2\">Github<\/a>.<\/p>\n<p>En el pr\u00f3ximo post, te mostrar\u00e9 c\u00f3mo usar Linq2Couchbase para crear, actualizar y borrar documentos. Tambi\u00e9n veremos la diferencia en flexibilidad que Couchbase puede darte comparado con un RDBMS tradicional como SQL Server.<\/p>\n<p>\u00bfTiene alguna pregunta? \u00bfAlgo no funciona como esperabas? D\u00e9janos un comentario, <a href=\"https:\/\/twitter.com\/mgroves\">ping me on Twitter<\/a>o env\u00edame un correo electr\u00f3nico (matthew.groves AT couchbase DOT com) y te ayudar\u00e9.<\/p>","protected":false},"excerpt":{"rendered":"<p>Part 1 covered how to install and setup Couchbase on Windows Part 2 covered some Couchbase lingo that you&#8217;ll need to know Part 3 showed the very simplest example of using Couchbase in ASP.NET In this blog post, I&#8217;m going [&hellip;]<\/p>","protected":false},"author":71,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10126,10127,1816,1819,1812],"tags":[1468,1469],"ppma_author":[8937],"class_list":["post-2267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-asp-dotnet","category-c-sharp","category-couchbase-server","category-data-modeling","category-n1ql-query","tag-linq","tag-linq2couchbase"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase with Windows &amp; .NET - Part 4 - The Couchbase Blog<\/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:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-net-part-4-linq2couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase with Windows and .NET - Part 4 - Linq2Couchbase\" \/>\n<meta property=\"og:description\" content=\"Part 1 covered how to install and setup Couchbase on Windows Part 2 covered some Couchbase lingo that you&#8217;ll need to know Part 3 showed the very simplest example of using Couchbase in ASP.NET In this blog post, I&#8217;m going [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-net-part-4-linq2couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-18T14:32:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-09T14:07:56+00:00\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Couchbase with Windows and .NET &#8211; Part 4 &#8211; Linq2Couchbase\",\"datePublished\":\"2016-05-18T14:32:38+00:00\",\"dateModified\":\"2025-10-09T14:07:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/\"},\"wordCount\":1360,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Linq\",\"linq2couchbase\"],\"articleSection\":[\".NET\",\"ASP.NET\",\"C#\",\"Couchbase Server\",\"Data Modeling\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/\",\"name\":\"Couchbase with Windows & .NET - Part 4 - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-05-18T14:32:38+00:00\",\"dateModified\":\"2025-10-09T14:07:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase with Windows and .NET &#8211; Part 4 &#8211; Linq2Couchbase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase with Windows & .NET - Part 4 - The Couchbase Blog","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:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-net-part-4-linq2couchbase\/","og_locale":"es_MX","og_type":"article","og_title":"Couchbase with Windows and .NET - Part 4 - Linq2Couchbase","og_description":"Part 1 covered how to install and setup Couchbase on Windows Part 2 covered some Couchbase lingo that you&#8217;ll need to know Part 3 showed the very simplest example of using Couchbase in ASP.NET In this blog post, I&#8217;m going [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-with-windows-net-part-4-linq2couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-05-18T14:32:38+00:00","article_modified_time":"2025-10-09T14:07:56+00:00","author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Couchbase with Windows and .NET &#8211; Part 4 &#8211; Linq2Couchbase","datePublished":"2016-05-18T14:32:38+00:00","dateModified":"2025-10-09T14:07:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/"},"wordCount":1360,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Linq","linq2couchbase"],"articleSection":[".NET","ASP.NET","C#","Couchbase Server","Data Modeling","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/","name":"Couchbase with Windows & .NET - Part 4 - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-05-18T14:32:38+00:00","dateModified":"2025-10-09T14:07:56+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase with Windows and .NET &#8211; Part 4 &#8211; Linq2Couchbase"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"A Matthew D. Groves le encanta programar.  No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa.  Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa.  Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores.  Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2267"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2267\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2267"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}