{"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\/pt\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/","title":{"rendered":"GA do provedor LINQ do Couchbase: LINQ, N1QL e Couchbase, oh mai!"},"content":{"rendered":"<p>Hoje, a Couchbase tem o prazer de anunciar o lan\u00e7amento da vers\u00e3o GA do provedor oficial de LINQ para o Couchbase Server e a linguagem de consulta quente para documentos JSON, N1QL! O objetivo do provedor \u00e9 fornecer um ORM\/ODM simples e f\u00e1cil de usar que seja mais pr\u00f3ximo do Linq2SQL do que o EntityFramework ou o NHibernate, que s\u00e3o detalhados e podem ser complexos.<\/p>\n<p>Embora o objetivo seja a simplicidade, n\u00e3o subestime o poder do Linq2Couchbase; ele \u00e9 uma implementa\u00e7\u00e3o totalmente funcional do Linq com suporte estendido para todos os recursos incr\u00edveis do N1QL!<\/p>\n<p>Nesta postagem, abordaremos os conceitos b\u00e1sicos para come\u00e7ar a usar o Linq2Couchbase, os principais atores da API e a integra\u00e7\u00e3o com o ASP.NET e o Owin\/Katana. Em postagens posteriores, entraremos em mais detalhes sobre as especificidades e os detalhes do Linq2Couchbase!<\/p>\n<h2 id=\"the-architecture\">A arquitetura<\/h2>\n<p>O provedor \u00e9, na verdade, apenas outra camada sobre o SDK; o provedor lida com a an\u00e1lise e a gera\u00e7\u00e3o de consultas e o SDK lida com a solicita\u00e7\u00e3o e o mapeamento dos resultados. O provedor usa <a href=\"https:\/\/relinq.codeplex.com\/\">Re-linq<\/a> internamente para criar uma \u00e1rvore de sintaxe abstrata (AST) a partir da consulta Linq, que \u00e9 ent\u00e3o usada para emitir a instru\u00e7\u00e3o N1QL. Observe que o Re-linq \u00e9 usado tanto pelo NHibernate quanto pelo EntityFramework, portanto, voc\u00ea est\u00e1 em boas m\u00e3os!<\/p>\n<h2 id=\"getting-started\">Primeiros passos<\/h2>\n<p>A fonte est\u00e1 dispon\u00edvel em <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\">Github<\/a> e o pacote est\u00e1 dispon\u00edvel em <a href=\"https:\/\/www.nuget.org\/packages\/Linq2Couchbase\/1.0.2\">NuGet<\/a>Se voc\u00ea usar o gerenciador de pacotes NuGet para instalar o Linq2Couchbase, todas as depend\u00eancias, inclusive o Couchbase.NET SDK, ser\u00e3o tratadas para voc\u00ea.<\/p>\n<p>Para instalar o Linq2Couchbase usando o gerenciador de pacotes NuGet (supondo que voc\u00ea j\u00e1 tenha criado um projeto do Visual Studio), abra o gerenciador de pacotes clicando com o bot\u00e3o direito do mouse em \"Manage Nuget Packages\" e procurando por Linq2Couchbase ou usando a linha de comando do gerenciador de pacotes:<\/p>\n<pre><code>PM&gt; Install-Package Linq2Couchbase \r\n<\/code><\/pre>\n<p>Depois de fazer isso, o projeto ter\u00e1 todas as depend\u00eancias necess\u00e1rias. Em seguida, voc\u00ea precisar\u00e1 instalar o Couchbase Server localmente ou por meio de uma VM. O link para download do Couchbase Server \u00e9 <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/nosql-databases\/downloads\/\">aqui<\/a>. Para as VMs, use <a href=\"https:\/\/github.com\/couchbaselabs\/vagrants\">vagabundos<\/a> que usa o Puppet e o Vagrant para instalar um cluster de servidores Couchbase. Certifique-se de instalar o Couchbase 4.0! Se estiver usando Vagrants, provisione o 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>Quando voc\u00ea tiver um servidor ou cluster do Couchbase, configure o servidor ou cluster e <strong><em>certifique-se de que pelo menos um n\u00f3 seja um n\u00f3 de \u00edndice e um n\u00f3 seja um n\u00f3 de consulta<\/em><\/strong>. Isso ser\u00e1 feito na primeira etapa da \"Configura\u00e7\u00e3o do servidor\" ou quando voc\u00ea adicionar um servidor adicional ao cluster. Al\u00e9m disso, adicione o conjunto de dados \"beer-sample\" ao cluster durante a configura\u00e7\u00e3o ou na guia Settings&gt;Samples (Configura\u00e7\u00f5es&gt;Amostras) depois de configurar o cluster ou a inst\u00e2ncia.<\/p>\n<p>Agora que sua inst\u00e2ncia ou cluster do Couchbase est\u00e1 configurado, voc\u00ea precisar\u00e1 criar um \u00edndice prim\u00e1rio no bucket \"beer-sample\". Para fazer isso, navegue at\u00e9 <code>C:Arquivos de programasCouchbaseServerbin ou, se estiver usando vagrants<\/code> (ou linux) <code>\/opts\/couchbase\/bin<\/code>usando um prompt de comando. Em seguida, digite cbq ou .\/cbq (no Linux) para iniciar a consulta CIL e depois:<\/p>\n<pre><code>CREATE PRIMARY INDEX ON `beer-sample` USING GSI;\r\n<\/code><\/pre>\n<p>Isso criar\u00e1 um \u00edndice prim\u00e1rio no bucket beer-sample. Observe os sinais de retrocesso \"`\", pois eles s\u00e3o necess\u00e1rios para escapar do \"-\" em beer-sample. Agora voc\u00ea est\u00e1 pronto para escrever algum c\u00f3digo!<\/p>\n<h2 id=\"creating-the-bucketcontext\">Criando o BucketContext<\/h2>\n<p>O principal objeto para trabalhar com o bucket \u00e9 o BucketContext. O BucketContext \u00e9 an\u00e1logo ao DataContext no Linq2Sql e ao DbContext no EntityFramework. Sua finalidade principal \u00e9 fornecer uma interface para criar consultas e envi\u00e1-las ao servidor Couchbase.<\/p>\n<p>Voc\u00ea pode usar o BucketContext como um objeto aut\u00f4nomo ou pode derivar dele e criar um objeto de tipagem forte que mapeie as propriedades para os tipos em seu modelo de dom\u00ednio e de balde. Neste exemplo, farei a segunda op\u00e7\u00e3o:<\/p>\n<pre><code>\/\/\/ \r\n\r\n\/\/\/ A concrete DbContext for the beer-sample example bucket.\r\n\/\/\/ <\/code><\/pre>\n<p>public class BeerSample : BucketContext { public BeerSample() : this(ClusterHelper.GetBucket(\"beer-sample\")) { } public BeerSample(IBucket bucket) : base(bucket) { DocumentFilterManager.SetFilter(new BreweryFilter()); } public IQueryable Beers { get { return Query(); } } public IQueryable Breweries { get { return Query(); } } }<\/p>\n<p>O bucket de amostras de cerveja (um bucket \u00e9 semelhante a um banco de dados em um sistema RDBMS) cont\u00e9m documentos que s\u00e3o \"tipificados\" como \"cervejaria\" e \"cerveja\". Esse sistema informal de tipos permitir\u00e1 consultar o bucket e retornar documentos de cervejaria ou documentos de cerveja por meio de um predicado (WHERE type=\"beer\", por exemplo). No c\u00f3digo acima, definimos propriedades expl\u00edcitas que retornam IQueryable<\/p>\n<h2 id=\"an-example-query\">Um exemplo de consulta<\/h2>\n<p>Voc\u00ea ver\u00e1 que o uso do Linq2Couchbase \u00e9 praticamente id\u00eantico ao do Linq2SQL ou do EF:<\/p>\n<pre><code>var db = new BeerSample();\r\n\r\nvar query = from beer in db.Beers\r\n            join brewery in db.Breweries\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(beer.Name);\r\n}    \r\n<\/code><\/pre>\n<p>Uma vez que voc\u00ea tenha uma refer\u00eancia ao BucketContext, basta consult\u00e1-lo como faria com qualquer outro provedor Linq. Todas as palavras-chave Linq s\u00e3o suportadas, bem como constru\u00e7\u00f5es N1QL como ON KEYS, NEST e UNNEST! Em uma postagem posterior, abordaremos tudo isso com muito mais detalhes!<\/p>\n<h2 id=\"the-document-model\">O modelo de documento<\/h2>\n<p>No contexto BeerSample acima, os objetos Beer e Brewery ser\u00e3o os alvos de nossas proje\u00e7\u00f5es Linq e correspondem ou mapeiam documentos JSON equivalentes em nosso bucket (beer-sample). Aqui est\u00e1 uma listagem de cada um (observe que esta \u00e9 uma listagem parcial, as classes em sua totalidade podem ser encontradas <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\/tree\/master\/Src\/Couchbase.Linq.IntegrationTests\/Documents\">aqui<\/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>\u00c9 claro que isso mapeia os documentos \"cerveja\"; observe o atributo DocumentTypeFilter. Isso adicionar\u00e1 \"automaticamente\" um predicado ou cl\u00e1usula WHERE que filtra pelo tipo \"cerveja\" a todas as consultas que t\u00eam como alvo esse documento. O atributo DocumentTypeFilter \u00e9 uma das duas maneiras de aplicar um filtro, a menos que voc\u00ea adicione manualmente o 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>Esse \u00e9 o objeto para o qual os documentos da \"cervejaria\" ser\u00e3o mapeados. Observe que n\u00e3o h\u00e1 nenhum atributo DocumentTypeFilter definido explicitamente; isso ocorre porque o construtor do contexto BeerSample adicionar\u00e1 o filtro ao DocumentFilterManager. Essa \u00e9 apenas uma abordagem diferente para o mesmo problema: adicionar um predicado a uma consulta para filtrar por tipo.<\/p>\n<h2 id=\"integrating-with-asp-net-or-owin-katana\">Integra\u00e7\u00e3o com ASP.NET ou Owin\/Katana<\/h2>\n<p>H\u00e1 um padr\u00e3o muito distinto para usar o SDK do Couchbase .NET em projetos ASP.NET ou Katana\/OWin. Como o BucketContext usa o SDK do Couchbase .NET, voc\u00ea precisar\u00e1 seguir esse padr\u00e3o para aproveitar o cache de objetos no SDK e as conex\u00f5es TCP compartilhadas. Felizmente, \u00e9 um padr\u00e3o muito simples:<\/p>\n<h3 id=\"using-global-asax-in-asp-net\">Usando o Global.asax no ASP.NET<\/h3>\n<p>Em um aplicativo ASP.NET que usa o Global.asax, voc\u00ea aproveitar\u00e1 os manipuladores de eventos Application_Start e Application_End para criar e destruir os objetos Cluster e Bucket dos quais o BucketContext depende.<\/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>Aqui estamos criando a configura\u00e7\u00e3o (a prop\u00f3sito, isso tamb\u00e9m pode vir do App.Config) e, em seguida, inicializando o objeto ClusterHelper. Finalmente, quando o aplicativo \u00e9 encerrado, estamos destruindo os objetos Cluster e Bucket de longa dura\u00e7\u00e3o no manipulador Application_End. Esse ser\u00e1 um desligamento gracioso e as constru\u00e7\u00f5es no n\u00edvel do sistema operacional ser\u00e3o devolvidas ao sistema operacional em tempo h\u00e1bil.<\/p>\n<h3 id=\"using-setup-cs-in-owin-katana\">Uso do Setup.cs no Owin\/Katana<\/h3>\n<p>Nos aplicativos hospedados na Owin\/Katana, seguimos um padr\u00e3o semelhante, apenas usamos um m\u00e9todo diferente, a classe 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>Aqui, criamos e inicializamos o ClusterHelper quando o m\u00e9todo Configuration \u00e9 executado na inicializa\u00e7\u00e3o e, em seguida, registramos um delegado que ser\u00e1 acionado quando o aplicativo for encerrado, fechando nosso ClusterHelper e liberando recursos.<\/p>\n<h3 id=\"injecting-into-your-controllers\">Injetando em seus controladores<\/h3>\n<p>O BucketContext em si assume as caracter\u00edsticas do padr\u00e3o Unit of Work; voc\u00ea pode criar um para cada solicita\u00e7\u00e3o e, como o ClusterHelper gerencia as refer\u00eancias (supondo que voc\u00ea esteja seguindo as orienta\u00e7\u00f5es acima), a inst\u00e2ncia ser\u00e1 simplesmente GC no final da solicita\u00e7\u00e3o.<\/p>\n<p>A maneira mais simples de fazer isso \u00e9 simplesmente usar <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/dependency-injection-aspnet-couchbase\/\">Inje\u00e7\u00e3o de depend\u00eancia<\/a> (o padr\u00e3o) em seus controladores para criar a inst\u00e2ncia quando o controlador for criado, por exemplo:<\/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>Agora, basta usar o BucketContext em seus m\u00e9todos de a\u00e7\u00e3o:<\/p>\n<pre><code>public ActionResult Index()\r\n{\r\n    var query = (from beer in db.Beers\r\n        join brewery in db.Breweries\r\n        on beer.BreweryId equals N1QlFunctions.Key(brewery)\r\n        select new { \r\n            beer.Name, \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>Mais uma vez, como o contexto \u00e9 um objeto leve e de curta dura\u00e7\u00e3o, voc\u00ea pode definir o escopo para a solicita\u00e7\u00e3o e injet\u00e1-lo l\u00e1, reutilizando-o para todos os controladores invocados nessa solicita\u00e7\u00e3o.<\/p>\n<h2 id=\"what-s-coming-up-\">O que est\u00e1 por vir?<\/h2>\n<p>Muito em breve, o pr\u00f3ximo grande recurso ser\u00e1 o Change Tracking usando proxies. Al\u00e9m disso, espere por corre\u00e7\u00f5es de bugs, aprimoramentos de desempenho e outros recursos destinados a tornar o Linq2Couchbase um ODM\/ORM leve e com todos os recursos!<\/p>\n<p>Se houver um recurso que voc\u00ea deseja, uma corre\u00e7\u00e3o de bug ou se quiser contribuir, agradecemos todos os tipos de feedback, tanto os bons quanto os ruins.<\/p>\n<ul>\n<li>O Jira \u00e9 <a href=\"https:\/\/issues.couchbase.com\/projects\/LINQ\">aqui<\/a>.<\/li>\n<li>O projeto Githb \u00e9 <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\/\">aqui<\/a>.<\/li>\n<\/ul>\n<p>O Linq2Couchbase \u00e9 um projeto de c\u00f3digo aberto voltado para a comunidade, portanto, d\u00ea uma olhada nele e, se quiser contribuir, fa\u00e7a-o!<\/p>\n<h2 id=\"special-thanks\">Agradecimentos especiais<\/h2>\n<p>Um agradecimento especial a todos os que contribu\u00edram com o projeto (afinal, trata-se de c\u00f3digo aberto!), especialmente a <a href=\"https:\/\/github.com\/brantburnett\">Brant Burnett<\/a> de <a href=\"https:\/\/centeredgesoftware.com\/\">Software Centeredge<\/a> que contribu\u00edram significativamente para o projeto e a documenta\u00e7\u00e3o do 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.7.1 (Yoast SEO v25.7) - 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\/pt\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/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\/pt\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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, engenheiro de software s\u00eanior, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 \u00e9 engenheiro de software s\u00eanior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff \u00e9 respons\u00e1vel pelo desenvolvimento dos SDKs do Couchbase e pela integra\u00e7\u00e3o com o N1QL (linguagem de consulta).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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","first_name":"Jeff","last_name":"Jeff Morris, Senior Software Engineer, Couchbase","user_url":"","author_category":"","description":"Jeff Morris \u00e9 engenheiro de software s\u00eanior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff \u00e9 respons\u00e1vel pelo desenvolvimento dos SDKs do Couchbase e pela integra\u00e7\u00e3o com o N1QL (linguagem de consulta)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2000","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2000"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2000\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2000"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}