{"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\/pt\/couchbase-with-windows-net-part-4-linq2couchbase\/","title":{"rendered":"Couchbase com Windows e .NET - Parte 4 - Linq2Couchbase"},"content":{"rendered":"<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-with-windows-and-.net---part-1\/\">A Parte 1 abordou como instalar e configurar o Couchbase no Windows<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-with-windows-and-.net---part-2\/\">A Parte 2 abordou alguns termos do Couchbase que voc\u00ea precisar\u00e1 conhecer<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-with-windows-and-.net---part-3---asp.net-mvc\/\">A Parte 3 mostrou o exemplo mais simples de uso do Couchbase no ASP.NET<\/a><\/li>\n<\/ul>\n<p>Nesta postagem do blog, vou me basear na parte 3, apresentando <a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\">Linq2Couchbase<\/a>. Tamb\u00e9m moverei o Couchbase para fora do Controller e o colocarei em uma vers\u00e3o muito b\u00e1sica do <a href=\"https:\/\/www.martinfowler.com\/eaaCatalog\/repository.html\">reposit\u00f3rio<\/a> aula. Meu objetivo nesta postagem do blog \u00e9 fazer com que voc\u00ea se sinta confort\u00e1vel com os conceitos b\u00e1sicos do Couchbase e do Linq2Couchbase e possa come\u00e7ar a aplic\u00e1-los em seu aplicativo da Web.<\/p>\n<h2>Movendo o Couchbase para fora do controlador<\/h2>\n<p>O trabalho do controlador \u00e9 direcionar o tr\u00e1fego: receber solicita\u00e7\u00f5es, entreg\u00e1-las a um modelo e, em seguida, fornecer os resultados \u00e0 visualiza\u00e7\u00e3o. Para acompanhar o <a href=\"https:\/\/www.butunclebob.com\/ArticleS.UncleBob.PrinciplesOfOod\">Princ\u00edpios SOLID<\/a> (especificamente o Princ\u00edpio da Responsabilidade \u00danica), o acesso aos dados deve estar em algum lugar em um \"modelo\" e n\u00e3o no controlador.<\/p>\n<p>A primeira etapa \u00e9 refatorar o c\u00f3digo existente. Podemos manter o \"exemplo realmente simples\" da Parte 3, mas ele deve ser movido para um m\u00e9todo em outra classe. Aqui est\u00e1 o HomeController refatorado e o novo 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>Alguns aspectos a serem observados:<\/p>\n<ul>\n<li>O HomeController n\u00e3o depende mais diretamente do Couchbase. Se a API do Couchbase fosse alterada, por exemplo, ter\u00edamos que fazer altera\u00e7\u00f5es apenas no PersonRepository, n\u00e3o no HomeController.<\/li>\n<li>N\u00e3o foi necess\u00e1rio informar explicitamente ao StructureMap como instanciar o PersonRepository. Ele acha que o PersonRepository \u00e9 \"auto-vinculado\". Se, em vez disso, eu usasse uma interface (como IPersonRepository), teria que fazer uma altera\u00e7\u00e3o no DefaultRegistry para informar isso ao StructureMap. Se voc\u00ea estiver usando um cont\u00eainer IoC diferente, a situa\u00e7\u00e3o pode ser diferente.<\/li>\n<\/ul>\n<h2>Refatora\u00e7\u00e3o para usar uma classe de pessoa<\/h2>\n<p>No exemplo acima, estou usando um <code>din\u00e2mico<\/code> objeto. <code>din\u00e2mico<\/code> \u00e9 \u00f3timo para algumas situa\u00e7\u00f5es, mas, nesse caso, seria uma boa ideia criar uma defini\u00e7\u00e3o mais concreta do que \u00e9 uma \"Pessoa\". Posso fazer isso com uma classe C#.<\/p>\n<pre><code>public class Person\r\n{\r\n    public string Name { get; set; } \r\n    public string Address { get; set; }\r\n}\r\n<\/code><\/pre>\n<p>Tamb\u00e9m atualizarei o PersonRepository para usar essa classe.<\/p>\n<pre><code>public Person GetPersonByKey(string key)\r\n{\r\n    return _bucket.Get(key).Value;\r\n}\r\n<\/code><\/pre>\n<p>Enquanto isso, vou tomar algumas medidas para tornar esse aplicativo mais parecido com um MVC adequado. Em vez de retornar Content(), farei com que a a\u00e7\u00e3o Index retorne um View e passarei a ele um <em>lista<\/em> de objetos Person. Criarei um arquivo Index.cshtml, que ser\u00e1 delegado a uma parte de _person.cshtml. Tamb\u00e9m vou inserir um layout que usa o Bootstrap. Essa \u00faltima parte \u00e9 totalmente gratuita, mas far\u00e1 com que as capturas de tela fiquem um pouco mais bonitas.<\/p>\n<p>Nova a\u00e7\u00e3o de \u00edndice:<\/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=\"\">person.cshtml:<\/p>\n<pre class=\"\">@model CouchbaseAspNetExample2.Models.Person \r\n&lt;div <span class=\"hljs-keyword\">classe<\/span>=<span class=\"hljs-string\">\"panel panel-default\"<\/span>&gt; \r\n&lt;div <span class=\"hljs-keyword\">classe<\/span>=<span class=\"hljs-string\">\"T\u00edtulo do painel\"<\/span>&gt; \r\n&lt;h2 <span class=\"hljs-keyword\">classe<\/span>=<span class=\"hljs-string\">\"t\u00edtulo do painel\"<\/span>&gt;@Model.Name&lt;\/h2&gt; \r\n&lt;\/div&gt; \r\n&lt;div <span class=\"hljs-keyword\">classe<\/span>=<span class=\"hljs-string\">\"painel-corpo\"<\/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>Agora est\u00e1 um pouco mais bonito. Al\u00e9m disso, poderemos mostrar uma lista completa de documentos pessoais mais adiante na demonstra\u00e7\u00e3o.<\/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>Apresentando o Linq2Couchbase<\/h2>\n<p>O Couchbase Server oferece suporte a uma linguagem de consulta conhecida como <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/n1ql\/\">N1QL<\/a>. \u00c9 um superconjunto de SQL e permite que voc\u00ea aproveite seu conhecimento existente de SQL para construir consultas muito poderosas sobre documentos JSON no Couchbase. O Linq2Couchbase leva isso um passo adiante e converte consultas Linq em consultas N1QL (da mesma forma que o Entity Framework converte consultas Linq em consultas SQL).<\/p>\n<p>O Linq2Couchbase faz parte do <a href=\"https:\/\/github.com\/couchbaselabs\">Laborat\u00f3rios Couchbase<\/a>e ainda n\u00e3o faz parte da biblioteca principal e suportada do Couchbase .NET SDK. No entanto, se voc\u00ea estiver acostumado com o Entity Framework, o NHibernate.Linq ou qualquer outro provedor Linq, essa \u00e9 uma \u00f3tima maneira de se apresentar ao Couchbase. Para algumas opera\u00e7\u00f5es, voc\u00ea ainda precisar\u00e1 usar o n\u00facleo do Couchbase .NET SDK, mas h\u00e1 muitas coisas que podemos fazer com o Linq2Couchbase.<\/p>\n<p>Comece adicionando o Linq2Couchbase com o NuGet (se ainda n\u00e3o o fez).<\/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>O N1QL (e, portanto, o Linq2Couchbase) depende do <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\">balde que est\u00e1 sendo indexado<\/a>. Acesse o Console do Couchbase, clique na guia \"Query\" (Consulta) e crie um \u00edndice prim\u00e1rio no <code>hello-couchbase<\/code> balde.<\/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>Se voc\u00ea n\u00e3o tiver um \u00edndice, o Linq2Couchbase fornecer\u00e1 uma mensagem de erro \u00fatil como \"No primary index on keyspace hello-couchbase. Use CREATE PRIMARY INDEX para criar um.\"<\/p>\n<p>Para usar o Linq2Couchbase de forma mais eficaz, precisamos come\u00e7ar a dar aos documentos do Couchbase um campo de \"tipo\". Dessa forma, podemos diferenciar entre um documento \"pessoa\" e um documento \"local\", por exemplo. Neste exemplo, terei apenas documentos de \"pessoa\", mas \u00e9 uma boa ideia fazer isso desde o in\u00edcio. Vou criar um campo Type e defini-lo como \"Person\". Tamb\u00e9m colocarei um atributo na classe C# para que o Linq2Couchbase entenda que essa classe se destina a um determinado 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>Se voc\u00ea fizer essas altera\u00e7\u00f5es, seu aplicativo continuar\u00e1 funcionando. Isso ocorre porque ainda estamos recuperando o documento por sua chave. Mas agora vamos alterar a a\u00e7\u00e3o Index para tentar obter TODOS os documentos pessoais.<\/p>\n<pre><code>public ActionResult Index()\r\n{\r\n    var list = _personRepo.GetAll();\r\n    return View(list);\r\n}\r\n<\/code><\/pre>\n<p>Precisaremos implementar esse novo m\u00e9todo de reposit\u00f3rio 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>Neste exemplo, estou dizendo ao Couchbase para ordenar todos os resultados por Nome. Se quiser, voc\u00ea pode experimentar os m\u00e9todos Linq normais com os quais est\u00e1 acostumado: Where, Select, Take, Skip e assim por diante.<\/p>\n<p>Ignore esse ScanConsistency por enquanto: Falarei mais sobre isso mais tarde. Mas e quanto ao IBucketContext? O IBucketContext \u00e9 semelhante ao DbContext do Entity Framework ou ao ISession do NHibernate. Para obter esse IBucketContext, precisaremos atualizar o 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>Isso est\u00e1 dizendo ao StructureMap que quero criar um novo BucketContext e quero que ele tenha o escopo de cada solicita\u00e7\u00e3o HTTP. Se voc\u00ea usar HttpContextScoped no StructureMap, tamb\u00e9m precisar\u00e1 usar <code>HttpContextLifecycle.DisposeAndClearAll()<\/code> no Application_EndRequest. Se voc\u00ea estiver usando um cont\u00eainer IoC diferente, ter\u00e1 de gerenci\u00e1-lo de forma diferente.<\/p>\n<p>Agora, se voc\u00ea compilar e executar o aplicativo Web novamente, ele exibir\u00e1 a mensagem \"There are no people yet\" (Ainda n\u00e3o h\u00e1 pessoas). Ei, onde eu fui parar?! Eu n\u00e3o apareci porque o documento \"foo::123\" ainda n\u00e3o tem um campo \"type\". V\u00e1 para o Console do Couchbase e adicione-o.<\/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>Depois de fazer isso, atualize sua p\u00e1gina da Web e a pessoa aparecer\u00e1 novamente.<\/p>\n<h2>Uma observa\u00e7\u00e3o r\u00e1pida sobre o ScanConsistency<\/h2>\n<p>O Linq2Couchbase depende de um \u00edndice para gerar e executar consultas. Quando voc\u00ea adiciona novos documentos, o \u00edndice precisa ser atualizado. At\u00e9 que o \u00edndice seja atualizado, os documentos ainda n\u00e3o indexados n\u00e3o ser\u00e3o retornados pelo Linq2Couchbase (por padr\u00e3o). Ao adicionar o ScanConsistency do 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 a documenta\u00e7\u00e3o do Couchbase para obter detalhes sobre a consist\u00eancia da varredura<\/a>), o Linq2Couchbase aguardar\u00e1 efetivamente at\u00e9 que o \u00edndice seja atualizado antes de executar uma consulta e retornar uma resposta. Essa \u00e9 uma troca que voc\u00ea ter\u00e1 de considerar ao projetar seu aplicativo. O que \u00e9 mais importante: velocidade bruta ou precis\u00e3o total?<\/p>\n<p>Como um exemplo simples, digamos que voc\u00ea esteja criando um sistema de gerenciamento de conte\u00fado:<\/p>\n<ul>\n<li>Se estiver criando ferramentas de administra\u00e7\u00e3o, provavelmente valoriza mais a precis\u00e3o total do que o desempenho.\n<ul>\n<li>Os administradores precisam saber exatamente o que h\u00e1 nos dados para gerenci\u00e1-los com efici\u00eancia.<\/li>\n<li>Os recursos administrativos s\u00e3o usados com pouca frequ\u00eancia em compara\u00e7\u00e3o com os recursos p\u00fablicos, portanto, alguma lat\u00eancia \u00e9 aceit\u00e1vel.<\/li>\n<\/ul>\n<\/li>\n<li>Se voc\u00ea estiver criando uma p\u00e1gina p\u00fablica que liste todo o conte\u00fado, a velocidade bruta provavelmente ser\u00e1 mais importante.\n<ul>\n<li>Se uma nova p\u00e1gina de conte\u00fado demorar um ou dois segundos a mais para aparecer para o p\u00fablico, n\u00e3o h\u00e1 problema.<\/li>\n<li>A parte p\u00fablica de um site ser\u00e1 acessada com muita frequ\u00eancia, portanto, o desempenho \u00e9 um fator importante.<\/li>\n<\/ul>\n<\/li>\n<li>Este \u00e9 apenas um exemplo: o tipo de consist\u00eancia de varredura que voc\u00ea deve usar depende de voc\u00ea e de seus casos de uso.<\/li>\n<\/ul>\n<h2>Conclus\u00e3o<\/h2>\n<p>O Linq2Couchbase \u00e9 uma ferramenta poderosa para trabalhar com o Couchbase de forma familiar. Ela \u00e9 de c\u00f3digo aberto, mas ainda n\u00e3o \u00e9 oficialmente suportada pelo Couchbase. Disponibilizei todo o c\u00f3digo para esta postagem do blog em <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-asp-net-blog-example-2\">Github<\/a>.<\/p>\n<p>No pr\u00f3ximo post, mostrarei como usar o Linq2Couchbase para criar, atualizar e excluir documentos. Tamb\u00e9m analisaremos a diferen\u00e7a de flexibilidade que o Couchbase pode oferecer em compara\u00e7\u00e3o com um RDBMS tradicional, como o SQL Server.<\/p>\n<p>Tem d\u00favidas? Algo n\u00e3o est\u00e1 funcionando como voc\u00ea esperava? Por favor, deixe um coment\u00e1rio, <a href=\"https:\/\/twitter.com\/mgroves\">me envie uma mensagem no Twitter<\/a>ou envie um e-mail para mim (matthew.groves AT couchbase DOT com) e eu o ajudarei!<\/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\/pt\/couchbase-with-windows-net-part-4-linq2couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\/pt\/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\/pt\/couchbase-with-windows-net-part-4-linq2couchbase\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-net-part-4-linq2couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"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\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 \u00e9 um cara que adora programar. N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa. Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90. Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores. Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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":"Matthew D. Groves \u00e9 um cara que adora programar.  N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa.  Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90.  Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores.  Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2267","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\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2267"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2267\/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=2267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2267"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}