{"id":2000,"date":"2015-10-27T20:51:14","date_gmt":"2015-10-27T20:51:14","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2000"},"modified":"2025-06-13T23:54:01","modified_gmt":"2025-06-14T06:54:01","slug":"linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/","title":{"rendered":"Couchbase LINQ Provider GA: LINQ, N1QL y Couchbase, \u00a1oh mai!"},"content":{"rendered":"<p>Hoy Couchbase se complace en anunciar el lanzamiento GA del proveedor oficial LINQ para Couchbase Server y el lenguaje de consulta de moda para documentos JSON, \u00a1N1QL! El objetivo del proveedor es proporcionar un ORM\/ODM simple y f\u00e1cil de usar que se acerque m\u00e1s a Linq2SQL que EntityFramework o NHibernate, que son verbosos y pueden ser complejos.<\/p>\n<p>Aunque la simplicidad es el objetivo, no subestimes el poder de Linq2Couchbase; \u00a1es una implementaci\u00f3n de Linq completamente funcional con soporte extendido para todas las incre\u00edbles caracter\u00edsticas de N1QL!<\/p>\n<p>En este post repasaremos lo b\u00e1sico para empezar con Linq2Couchbase, los principales actores de la API, y la integraci\u00f3n con ASP.NET y Owin\/Katana. \u00a1En posts posteriores entraremos en m\u00e1s detalle sobre los pormenores y detalles de Linq2Couchbase!<\/p>\n<h2 id=\"the-architecture\">Arquitectura<\/h2>\n<p>El proveedor es en realidad una capa m\u00e1s sobre el SDK; el proveedor se encarga del an\u00e1lisis sint\u00e1ctico y la generaci\u00f3n de consultas y el SDK se encarga de la solicitud y la asignaci\u00f3n de los resultados. El proveedor utiliza <a href=\"https:\/\/relinq.codeplex.com\/\">Re-linq<\/a> internamente para crear un \u00e1rbol de sintaxis abstracta (AST) a partir de la consulta Linq, que luego se utiliza para emitir la sentencia N1QL. Ten en cuenta que Re-linq es utilizado tanto por NHibernate como por EntityFramework, \u00a1as\u00ed que est\u00e1s en buenas manos!<\/p>\n<h2 id=\"getting-started\">Primeros pasos<\/h2>\n<p>La fuente est\u00e1 disponible en <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\">Github<\/a> y el paquete est\u00e1 disponible en <a href=\"https:\/\/www.nuget.org\/packages\/Linq2Couchbase\/1.0.2\">NuGet<\/a>Si utilizas el gestor de paquetes NuGet para instalar Linq2Couchbase, todas las dependencias, incluido el SDK de Couchbase.NET, ser\u00e1n gestionadas por ti.<\/p>\n<p>Para instalar Linq2Couchbase utilizando el gestor de paquetes NuGet (suponiendo que ya has creado un proyecto de Visual Studio) abre el gestor de paquetes haciendo clic con el bot\u00f3n derecho del rat\u00f3n en \"Manage Nuget Packages\" y buscando Linq2Couchbase o utilizando la l\u00ednea de comandos del gestor de paquetes:<\/p>\n<pre><code>PM&gt; Install-Package Linq2Couchbase \r\n<\/code><\/pre>\n<p>Una vez hecho esto el proyecto tendr\u00e1 todas las dependencias necesarias. A continuaci\u00f3n tendr\u00e1s que instalar Couchbase Server, ya sea localmente o a trav\u00e9s de m\u00e1quinas virtuales. El enlace de descarga de Couchbase Server es <a href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/downloads\/\">aqu\u00ed<\/a>. Para las m\u00e1quinas virtuales, utilice <a href=\"https:\/\/github.com\/couchbaselabs\/vagrants\">vagabundos<\/a> que utiliza Puppet y Vagrant para instalar un cluster de servidores Couchbase. \u00a1Aseg\u00farate de instalar Couchbase 4.0! Si est\u00e1s usando Vagrants, entonces aprovisiona el cluster:<\/p>\n<pre><code>peep@ELJEFE-PC ~\/repos\/vagrants\/4.0.0\/debian7 (master)\r\n$ vagrant up\r\n<\/code><\/pre>\n<p>Una vez que tenga un Servidor o cluster Couchbase, configure el Servidor o Cluster y <strong><em>aseg\u00farese de que al menos un nodo es un nodo \u00cdndice y un nodo es un nodo Consulta<\/em><\/strong>. Esto lo har\u00e1 en el primer paso de la \"Configuraci\u00f3n del Servidor\" o cuando a\u00f1ada un servidor adicional a su cluster. Adem\u00e1s, a\u00f1ada el conjunto de datos \"muestra-cerveza\" al cl\u00faster durante la configuraci\u00f3n o desde la pesta\u00f1a Configuraci\u00f3n&gt;Muestras despu\u00e9s de haber configurado el cl\u00faster o la instancia.<\/p>\n<p>Ahora que tu instancia o cluster de Couchbase est\u00e1 configurado, necesitar\u00e1s crear un \u00edndice primario en el bucket \"beer-sample\". Para ello, navega a <code>C:Archivos de programaCouchbaseServerbin o si utiliza vagrants<\/code> (o linux) <code>\/opts\/couchbase\/bin<\/code>utilizando un s\u00edmbolo del sistema. A continuaci\u00f3n, escriba cbq o .\/cbq (en linux) para iniciar la consulta CIL y luego:<\/p>\n<pre><code>CREATE PRIMARY INDEX ON `beer-sample` USING GSI;\r\n<\/code><\/pre>\n<p>Esto crear\u00e1 un \u00edndice primario en el cubo beer-sample. F\u00edjese en las comillas \"`\", son necesarias para escapar el \"-\" de beer-sample. Ahora est\u00e1 listo para escribir algo de c\u00f3digo.<\/p>\n<h2 id=\"creating-the-bucketcontext\">Creaci\u00f3n del BucketContext<\/h2>\n<p>El objeto principal para trabajar con el bucket es el BucketContext. El BucketContext es an\u00e1logo al DataContext en Linq2Sql y al DbContext en EntityFramework. Su prop\u00f3sito principal es proporcionar una interfaz para construir consultas y enviarlas al servidor Couchbase.<\/p>\n<p>Puede utilizar BucketContext como un objeto independiente o puede derivar de \u00e9l y crear un objeto fuertemente tipado que asigne propiedades a los tipos de su modelo de dominio y cubo. En este ejemplo har\u00e9 esto \u00faltimo:<\/p>\n<pre><code>\/\/\/\r\n\r\n\/\/\/ Un DbContext concreto para el cubo de ejemplo muestra-cerveza.\r\n\/\/\/ <\/code><\/pre>\n<p>public class CervezaMuestra : BucketContext { public CervezaMuestra() : this(ClusterHelper.GetBucket(\"cerveza-muestra\")) { } public CervezaMuestra(IBucket bucket) : base(bucket) { DocumentFilterManager.SetFilter(new BreweryFilter()); } public IQueryable Cervezas { get { return Query(); } } public IQueryable Cervecer\u00edas { get { return Consulta(); } } }<\/p>\n<p>El bucket de muestras de cerveza (un bucket es similar a una base de datos en un sistema RDBMS) contiene documentos que est\u00e1n \"tipados\" como \"cervecer\u00eda\" y \"cerveza\", este sistema de tipado informal permitir\u00e1 consultar el bucket y devolver documentos de cervecer\u00eda o documentos de cerveza mediante un predicado(WHERE type=\"beer\" por ejemplo). En el c\u00f3digo anterior hemos definido propiedades expl\u00edcitas que devuelven IQueryable<\/p>\n<h2 id=\"an-example-query\">Ejemplo de consulta<\/h2>\n<p>Ver\u00e1s que utilizar Linq2Couchbase es pr\u00e1cticamente id\u00e9ntico a Linq2SQL o al EF:<\/p>\n<pre><code>var db = nueva BeerSample();\r\n\r\nvar query = from cerveza in db.Cervezas\r\n            join cervecer\u00eda in db.Cervecer\u00edas\r\n            on beer.BreweryId equals N1QlFunctions.Key(brewery)\r\n            select new { beer.Name, beer.Abv, BreweryName = brewery.Name };\r\n\r\nforeach (var beer in query)\r\n{\r\n    Console.WriteLine(cerveza.Nombre);\r\n}    \r\n<\/code><\/pre>\n<p>Una vez que tengas una referencia BucketContext todo lo que tienes que hacer es consultarlo como lo har\u00edas con cualquier otro proveedor Linq. Todas las palabras clave de Linq est\u00e1n soportadas, as\u00ed como las construcciones de N1QL como ON KEYS, NEST y UNNEST. En un post posterior, veremos todo esto con mucho m\u00e1s detalle.<\/p>\n<h2 id=\"the-document-model\">El modelo de documento<\/h2>\n<p>En el contexto BeerSample anterior, los objetos Beer y Brewery ser\u00e1n los objetivos de nuestras proyecciones Linq y corresponden o se asignan a documentos JSON equivalentes en nuestro bucket (beer-sample). He aqu\u00ed una lista de cada uno (tenga en cuenta que se trata de una lista parcial, las clases en su totalidad se puede encontrar <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\/tree\/master\/Src\/Couchbase.Linq.IntegrationTests\/Documents\">aqu\u00ed<\/a>):<\/p>\n<pre><code>[Filters.DocumentTypeFilter(\"beer\")]\r\npublic class BeerFiltered\r\n{\r\n    [JsonProperty(\"name\")]\r\n    public string Name { get; set; }\r\n\r\n    [JsonProperty(\"abv\")]\r\n    public decimal Abv { get; set; }\r\n\r\n    ...\r\n\r\n    [JsonProperty(\"category\")]\r\n    public string Category { get; set; }\r\n\r\n    [JsonProperty(\"updated\")]\r\n    public DateTime Updated { get; set; }\r\n}\r\n<\/code><\/pre>\n<p>Por supuesto, esto corresponde a los documentos \"cerveza\"; observe el atributo DocumentTypeFilter. Esto a\u00f1adir\u00e1 \"auto-m\u00e1gicamente\" un predicado o cl\u00e1usula WHERE que filtra por el tipo \"cerveza\" a cada consulta que tenga como objetivo ese documento. El atributo DocumentTypeFilter es una de las dos formas de aplicar un filtro, a menos que a\u00f1ada manualmente el predicado a cada consulta.<\/p>\n<pre><code>public class Brewery\r\n{\r\n    [JsonProperty(\"name\")]\r\n    public string Name { get; set; }\r\n\r\n    [JsonProperty(\"city\")]\r\n    public string City { get; set; }\r\n\r\n    ...\r\n\r\n    [JsonProperty(\"geo\")]\r\n    public Geo Geo { get; set; }\r\n\r\n    [JsonProperty(\"beers\")]\r\n    public List Beers { get; set; }\r\n}\r\n<\/code><\/pre>\n<p>Este es el objeto al que se asignar\u00e1n los documentos \"cervecer\u00eda\". Observe que no hay ning\u00fan atributo DocumentTypeFilter definido expl\u00edcitamente; esto se debe a que el constructor para el contexto BeerSample a\u00f1adir\u00e1 el filtro al DocumentFilterManager. Esto es puramente una aproximaci\u00f3n diferente al mismo problema; a\u00f1adir un predicado a una consulta para filtrar por tipo.<\/p>\n<h2 id=\"integrating-with-asp-net-or-owin-katana\">Integraci\u00f3n con ASP.NET u Owin\/Katana<\/h2>\n<p>Existe un patr\u00f3n muy definido para usar el SDK de Couchbase .NET en proyectos ASP.NET o Katana\/OWin. Dado que BucketContext utiliza el SDK de Couchbase .NET, tendr\u00e1s que seguir este patr\u00f3n para poder aprovechar la cach\u00e9 de objetos dentro del SDK y las conexiones TCP compartidas. Afortunadamente, es un patr\u00f3n muy simple:<\/p>\n<h3 id=\"using-global-asax-in-asp-net\">Uso de Global.asax en ASP.NET<\/h3>\n<p>En una aplicaci\u00f3n ASP.NET que utilice Global.asax, aprovechar\u00e1 los manejadores de eventos Application_Start y Application_End para crear y destruir los objetos Cluster y Bucket de los que depende BucketContext.<\/p>\n<pre><code>public class MvcApplication : System.Web.HttpApplication\r\n{\r\n    protected async void Application_Start()\r\n    {\r\n        AreaRegistration.RegisterAllAreas();\r\n        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);\r\n        RouteConfig.RegisterRoutes(RouteTable.Routes);\r\n        BundleConfig.RegisterBundles(BundleTable.Bundles);\r\n\r\n        var config = new ClientConfiguration\r\n        {\r\n            Servers = new List\r\n            {\r\n                new Uri(\"https:\/\/192.168.77.101:8091\/\")\r\n            }\r\n        };\r\n\r\n        ClusterHelper.Initialize(config);\r\n        var bucket = ClusterHelper.GetBucket(\"default\");\r\n    }\r\n\r\n    protected void Application_End()\r\n    {\r\n        ClusterHelper.Close();\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Aqu\u00ed estamos creando la configuraci\u00f3n (aunque tambi\u00e9n puede venir de App.Config) y luego inicializando el objeto ClusterHelper. Finalmente, cuando la aplicaci\u00f3n se cierra, destruimos los objetos Cluster y Bucket en el manejador Application_End. Este ser\u00e1 un cierre elegante y las construcciones a nivel de SO ser\u00e1n devueltas al SO de manera oportuna.<\/p>\n<h3 id=\"using-setup-cs-in-owin-katana\">Uso de Setup.cs en Owin\/Katana<\/h3>\n<p>En las aplicaciones alojadas en Owin\/Katana, seguimos un patr\u00f3n similar, s\u00f3lo que utilizamos un m\u00e9todo diferente, la clase Setup.cs.<\/p>\n<pre><code>public partial class Startup\r\n{\r\n    public void Configuration(IAppBuilder app)\r\n    {\r\n        ConfigureAuth(app);\r\n\r\n        \/\/initialize the ClusterHelper\r\n        ClusterHelper.Initialize(new ClientConfiguration\r\n        {\r\n            Servers = new List\r\n            {\r\n                new Uri(\"https:\/\/localhost:8091\/\")\r\n            }\r\n        });\r\n\r\n        \/\/Register a callback that will dispose of the ClusterHelper on app shutdown\r\n        var properties = new AppProperties(app.Properties);\r\n        var token = properties.OnAppDisposing;\r\n        if (token != CancellationToken.None)\r\n        {\r\n            token.Register(() =&gt;\r\n            {\r\n                ClusterHelper.Close();\r\n            });\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Aqu\u00ed creamos e inicializamos el ClusterHelper cuando el m\u00e9todo Configuration se ejecuta al inicio y luego registramos un delegado que se disparar\u00e1 cuando la aplicaci\u00f3n se cierre, cerrando nuestro ClusterHelper y liberando recursos.<\/p>\n<h3 id=\"injecting-into-your-controllers\">Inyecci\u00f3n en los controladores<\/h3>\n<p>El propio BucketContext adopta las caracter\u00edsticas del patr\u00f3n Unit of Work; puedes crear uno para cada petici\u00f3n y como el ClusterHelper gestiona las referencias (asumiendo que sigues los consejos anteriores) la instancia simplemente ser\u00e1 GC'd al final de la petici\u00f3n.<\/p>\n<p>La forma m\u00e1s sencilla de hacerlo es simplemente utilizando <a href=\"https:\/\/www.couchbase.com\/blog\/es\/dependency-injection-aspnet-couchbase\/\">Inyecci\u00f3n de dependencia<\/a> (el patr\u00f3n) dentro de sus controladores para crear la instancia cuando se crea el controlador, por ejemplo:<\/p>\n<pre><code>public class HomeController : Controller\r\n{\r\n    private BeerSample _context;\r\n\r\n    public HomeController()\r\n        : this(new BeerSample(ClusterHelper.GetBucket(\"beer-sample\")))\r\n    {\r\n    }\r\n\r\n    public HomeController(BeerSample context)\r\n    {\r\n        _context = context;\r\n    }\r\n\r\n    ...\r\n}\r\n<\/code><\/pre>\n<p>Ahora, s\u00f3lo tiene que utilizar el BucketContext dentro de sus m\u00e9todos de acci\u00f3n:<\/p>\n<pre><code>public ActionResult \u00cdndice()\r\n{\r\n    var query = (from cerveza in db.Cervezas\r\n        join cervecer\u00eda in db.Cervecer\u00edas\r\n        on beer.BreweryId equals N1QlFunctions.Key(brewery)\r\n        select new {\r\n            cerveza.Nombre,\r\n            beer.Abv,\r\n            BreweryName = brewery.Name\r\n        }).Take(10);\r\n\r\n    return View(query.ToList());\r\n}\r\n<\/code><\/pre>\n<p>Una vez m\u00e1s, dado que el contexto es un objeto ligero de corta duraci\u00f3n, puedes extenderlo a la solicitud e inyectarlo all\u00ed reutiliz\u00e1ndolo para todos los controladores invocados dentro de esa solicitud.<\/p>\n<h2 id=\"what-s-coming-up-\">\u00bfQu\u00e9 se avecina?<\/h2>\n<p>Muy pronto, la siguiente caracter\u00edstica importante ser\u00e1 el seguimiento de cambios mediante proxies. Adem\u00e1s, \u00a1espera correcciones de errores, mejoras de rendimiento y otras caracter\u00edsticas destinadas a hacer de Linq2Couchbase un ODM\/ORM ligero y con todas las funciones!<\/p>\n<p>Si hay alguna funci\u00f3n que desee, una correcci\u00f3n de errores o tal vez quiera contribuir, agradecemos todo tipo de comentarios, tanto buenos como malos.<\/p>\n<ul>\n<li>El Jira es <a href=\"https:\/\/issues.couchbase.com\/projects\/LINQ\">aqu\u00ed<\/a>.<\/li>\n<li>El proyecto Githb es <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\/\">aqu\u00ed<\/a>.<\/li>\n<\/ul>\n<p>Linq2Couchbase es un proyecto de c\u00f3digo abierto impulsado por la comunidad, as\u00ed que \u00e9chale un vistazo y, si quieres contribuir, \u00a1hazlo!<\/p>\n<h2 id=\"special-thanks\">Agradecimientos especiales<\/h2>\n<p>Un agradecimiento especial a todos los que han contribuido al proyecto (\u00a1al fin y al cabo es de c\u00f3digo abierto!), especialmente a <a href=\"https:\/\/github.com\/brantburnett\">Brant Burnett<\/a> de <a href=\"https:\/\/centeredgesoftware.com\/\">Software Centeredge<\/a> que han contribuido significativamente al proyecto y a la documentaci\u00f3n de NuGet.<\/p>","protected":false},"excerpt":{"rendered":"<p>Today Couchbase is happy to announce the GA release of the official LINQ provider for Couchbase Server and the hot query language for JSON documents, N1QL! The goal of the provider is to provide a simple, easy to use ORM\/ODM [&hellip;]<\/p>","protected":false},"author":21,"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,1812],"tags":[1468,1469],"ppma_author":[8970],"class_list":["post-2000","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-n1ql-query","tag-linq","tag-linq2couchbase"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase<\/title>\n<meta name=\"description\" content=\"Learn the basics of getting started with Linq2Couchbase, the major actors in the API, and integration with ASP.NET and Owin\/Katana.\" \/>\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\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase, oh mai!\" \/>\n<meta property=\"og:description\" content=\"Learn the basics of getting started with Linq2Couchbase, the major actors in the API, and integration with ASP.NET and Owin\/Katana.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-27T20:51:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:54:01+00:00\" \/>\n<meta name=\"author\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jeffrysmorris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\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\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase, oh mai!\",\"datePublished\":\"2015-10-27T20:51:14+00:00\",\"dateModified\":\"2025-06-14T06:54:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\"},\"wordCount\":1422,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Linq\",\"linq2couchbase\"],\"articleSection\":[\".NET\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\",\"name\":\"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-10-27T20:51:14+00:00\",\"dateModified\":\"2025-06-14T06:54:01+00:00\",\"description\":\"Learn the basics of getting started with Linq2Couchbase, the major actors in the API, and integration with ASP.NET and Owin\/Katana.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#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\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase, oh mai!\"}]},{\"@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\/b678bdd9f7b21a33d43ea965865a3341\",\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"caption\":\"Jeff Morris, Senior Software Engineer, Couchbase\"},\"description\":\"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).\",\"sameAs\":[\"https:\/\/x.com\/jeffrysmorris\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/jeff-morris\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase","description":"Learn the basics of getting started with Linq2Couchbase, the major actors in the API, and integration with ASP.NET and Owin\/Katana.","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\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/","og_locale":"es_MX","og_type":"article","og_title":"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase, oh mai!","og_description":"Learn the basics of getting started with Linq2Couchbase, the major actors in the API, and integration with ASP.NET and Owin\/Katana.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-10-27T20:51:14+00:00","article_modified_time":"2025-06-14T06:54:01+00:00","author":"Jeff Morris, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@jeffrysmorris","twitter_misc":{"Written by":"Jeff Morris, Senior Software Engineer, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase, oh mai!","datePublished":"2015-10-27T20:51:14+00:00","dateModified":"2025-06-14T06:54:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/"},"wordCount":1422,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Linq","linq2couchbase"],"articleSection":[".NET","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/","url":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/","name":"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-10-27T20:51:14+00:00","dateModified":"2025-06-14T06:54:01+00:00","description":"Learn the basics of getting started with Linq2Couchbase, the major actors in the API, and integration with ASP.NET and Owin\/Katana.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#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\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase LINQ Provider GA: LINQ, N1QL and Couchbase, oh mai!"}]},{"@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\/b678bdd9f7b21a33d43ea965865a3341","name":"Jeff Morris, Ingeniero Superior de Software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812","url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","caption":"Jeff Morris, Senior Software Engineer, Couchbase"},"description":"Jeff Morris es Ingeniero de Software Senior en Couchbase. Antes de unirse a Couchbase, Jeff pas\u00f3 seis a\u00f1os en Source Interlink como Arquitecto Web Empresarial. Jeff es responsable del desarrollo de los SDK de Couchbase y de c\u00f3mo integrarse con N1QL (lenguaje de consulta).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/jeff-morris\/"}]}},"authors":[{"term_id":8970,"user_id":21,"is_guest":0,"slug":"jeff-morris","display_name":"Jeff Morris, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","author_category":"","last_name":"Jeff Morris, Senior Software Engineer, Couchbase","first_name":"Jeff","job_title":"","user_url":"","description":"Jeff Morris es Ingeniero de Software Senior en Couchbase. Antes de unirse a Couchbase, Jeff pas\u00f3 seis a\u00f1os en Source Interlink como Arquitecto Web Empresarial. Jeff es responsable del desarrollo de los SDK de Couchbase y de c\u00f3mo integrarse con N1QL (lenguaje de consulta)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2000","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\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2000"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2000\/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=2000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2000"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}