[{"data":1,"prerenderedAt":1223},["ShallowReactive",2],{"blog:2018:azure-functions-differences-v1-v2":3,"blogMore-Development":1209,"comments-azure-functions-differences-v1-v2":1222},{"id":4,"title":5,"body":6,"category":1192,"commentCount":65,"date":1193,"description":12,"excerpt":1194,"extension":1195,"filenames":1196,"hidden":1197,"image":1196,"meta":1198,"minutes":144,"navigation":230,"path":1199,"seo":1200,"showCategory":1196,"stem":1201,"tags":1202,"updated":1196,"url":1206,"wordCount":1207,"__hash__":1208},"content\u002Fblog\u002F2018\u002Fazure-functions-differences-v1-v2.md","Differences between Azure Functions v1 and v2 in C#",{"type":7,"value":8,"toc":1185},"minimark",[9,13,16,19,24,443,447,732,736,739,765,772,776,779,1053,1057,1063,1175,1181],[10,11,12],"p",{},"I've been messing around in the .NET ecosystem again, jumping back in with Azure Functions (similar to AWS Lambda) to get my blog onto 99% static hosting. I immediately ran into the API changes between v1 and v2 (currently in beta).",[10,14,15],{},"These changes are because v1 was based around .NET 4.6 using WebAPI 2 while v2 is based on ASP.NET Core which uses MVC 6. There are some guides around conversion, but none in the context of Azure Functions.",[10,17,18],{},"I'll illustrate with a PageViewCount sample that uses Table Storage to retrieve and update a simple page count.",[20,21,23],"h2",{"id":22},"v1-net-461-webapi-2","v1 (.NET 4.61 \u002F WebAPI 2)",[25,26,31],"pre",{"className":27,"code":28,"language":29,"meta":30,"style":30},"language-csharp shiki shiki-themes everforest-light dracula","[FunctionName(\"PageView\")]\npublic static async Task\u003CHttpResponseMessage> Run(\n    [HttpTrigger(AuthorizationLevel.Anonymous, \"get\")]HttpRequestMessage req, TraceWriter log) {\n    var page = req.MessageUri.ParseQueryString()[\"page\"];\n    if (String.IsNullOrEmpty(page))\n        return req.CreateErrorResponse(HttpStatusCode.BadRequest, \"'page' parameter missing.\");\n\n    var table = Helpers.GetTableReference(\"PageViewCounts\");\n    var pageView = await table.RetrieveAsync\u003CPageViewCount>(\"damieng.com\", page)\n        ?? new PageViewCount(page) { ViewCount = 0 };\n    var operation = pageView.ViewCount == 0\n        ? TableOperation.Insert(pageView)\n        : TableOperation.Replace(pageView);\n    pageView.ViewCount++;\n    await table.ExecuteAsync(operation);\n\n    return req.CreateResponse(HttpStatusCode.OK, new { viewCount = pageView.ViewCount });\n}\n","csharp","",[32,33,34,63,95,142,180,196,225,232,259,296,320,342,357,371,385,399,404,437],"code",{"__ignoreMap":30},[35,36,39,43,47,50,54,58,60],"span",{"class":37,"line":38},"line",1,[35,40,42],{"class":41},"s6Vpi","[",[35,44,46],{"class":45},"snuxY","FunctionName",[35,48,49],{"class":41},"(",[35,51,53],{"class":52},"sciFF","\"",[35,55,57],{"class":56},"sJQOs","PageView",[35,59,53],{"class":52},[35,61,62],{"class":41},")]\n",[35,64,66,70,73,76,79,82,85,88,92],{"class":37,"line":65},2,[35,67,69],{"class":68},"s9HRq","public",[35,71,72],{"class":68}," static",[35,74,75],{"class":68}," async",[35,77,78],{"class":45}," Task",[35,80,81],{"class":41},"\u003C",[35,83,84],{"class":45},"HttpResponseMessage",[35,86,87],{"class":41},"> ",[35,89,91],{"class":90},"sS4Kt","Run",[35,93,94],{"class":41},"(\n",[35,96,98,101,104,107,111,114,116,119,121,124,127,131,133,136,139],{"class":37,"line":97},3,[35,99,100],{"class":41},"    [",[35,102,103],{"class":45},"HttpTrigger",[35,105,106],{"class":41},"(AuthorizationLevel.",[35,108,110],{"class":109},"sSKRk","Anonymous",[35,112,113],{"class":41},", ",[35,115,53],{"class":52},[35,117,118],{"class":56},"get",[35,120,53],{"class":52},[35,122,123],{"class":41},")]",[35,125,126],{"class":45},"HttpRequestMessage",[35,128,130],{"class":129},"s7cAX"," req",[35,132,113],{"class":41},[35,134,135],{"class":45},"TraceWriter",[35,137,138],{"class":129}," log",[35,140,141],{"class":41},") {\n",[35,143,145,149,152,155,158,161,164,167,170,172,175,177],{"class":37,"line":144},4,[35,146,148],{"class":147},"sXAHl","    var",[35,150,151],{"class":41}," page ",[35,153,154],{"class":68},"=",[35,156,157],{"class":41}," req.",[35,159,160],{"class":109},"MessageUri",[35,162,163],{"class":41},".",[35,165,166],{"class":90},"ParseQueryString",[35,168,169],{"class":41},"()[",[35,171,53],{"class":52},[35,173,174],{"class":56},"page",[35,176,53],{"class":52},[35,178,179],{"class":41},"];\n",[35,181,183,187,190,193],{"class":37,"line":182},5,[35,184,186],{"class":185},"smiwp","    if",[35,188,189],{"class":41}," (String.",[35,191,192],{"class":90},"IsNullOrEmpty",[35,194,195],{"class":41},"(page))\n",[35,197,199,202,204,207,210,213,215,217,220,222],{"class":37,"line":198},6,[35,200,201],{"class":185},"        return",[35,203,157],{"class":41},[35,205,206],{"class":90},"CreateErrorResponse",[35,208,209],{"class":41},"(HttpStatusCode.",[35,211,212],{"class":109},"BadRequest",[35,214,113],{"class":41},[35,216,53],{"class":52},[35,218,219],{"class":56},"'page' parameter missing.",[35,221,53],{"class":52},[35,223,224],{"class":41},");\n",[35,226,228],{"class":37,"line":227},7,[35,229,231],{"emptyLinePlaceholder":230},true,"\n",[35,233,235,237,240,242,245,248,250,252,255,257],{"class":37,"line":234},8,[35,236,148],{"class":147},[35,238,239],{"class":41}," table ",[35,241,154],{"class":68},[35,243,244],{"class":41}," Helpers.",[35,246,247],{"class":90},"GetTableReference",[35,249,49],{"class":41},[35,251,53],{"class":52},[35,253,254],{"class":56},"PageViewCounts",[35,256,53],{"class":52},[35,258,224],{"class":41},[35,260,262,264,267,269,272,275,278,280,283,286,288,291,293],{"class":37,"line":261},9,[35,263,148],{"class":147},[35,265,266],{"class":41}," pageView ",[35,268,154],{"class":68},[35,270,271],{"class":185}," await",[35,273,274],{"class":41}," table.",[35,276,277],{"class":90},"RetrieveAsync",[35,279,81],{"class":41},[35,281,282],{"class":45},"PageViewCount",[35,284,285],{"class":41},">(",[35,287,53],{"class":52},[35,289,290],{"class":56},"damieng.com",[35,292,53],{"class":52},[35,294,295],{"class":41},", page)\n",[35,297,299,302,305,308,311,313,317],{"class":37,"line":298},10,[35,300,301],{"class":68},"        ??",[35,303,304],{"class":185}," new",[35,306,307],{"class":45}," PageViewCount",[35,309,310],{"class":41},"(page) { ViewCount ",[35,312,154],{"class":68},[35,314,316],{"class":315},"s3Ipq"," 0",[35,318,319],{"class":41}," };\n",[35,321,323,325,328,330,333,336,339],{"class":37,"line":322},11,[35,324,148],{"class":147},[35,326,327],{"class":41}," operation ",[35,329,154],{"class":68},[35,331,332],{"class":41}," pageView.",[35,334,335],{"class":109},"ViewCount",[35,337,338],{"class":68}," ==",[35,340,341],{"class":315}," 0\n",[35,343,345,348,351,354],{"class":37,"line":344},12,[35,346,347],{"class":68},"        ?",[35,349,350],{"class":41}," TableOperation.",[35,352,353],{"class":90},"Insert",[35,355,356],{"class":41},"(pageView)\n",[35,358,360,363,365,368],{"class":37,"line":359},13,[35,361,362],{"class":68},"        :",[35,364,350],{"class":41},[35,366,367],{"class":90},"Replace",[35,369,370],{"class":41},"(pageView);\n",[35,372,374,377,379,382],{"class":37,"line":373},14,[35,375,376],{"class":41},"    pageView.",[35,378,335],{"class":109},[35,380,381],{"class":68},"++",[35,383,384],{"class":41},";\n",[35,386,388,391,393,396],{"class":37,"line":387},15,[35,389,390],{"class":185},"    await",[35,392,274],{"class":41},[35,394,395],{"class":90},"ExecuteAsync",[35,397,398],{"class":41},"(operation);\n",[35,400,402],{"class":37,"line":401},16,[35,403,231],{"emptyLinePlaceholder":230},[35,405,407,410,412,415,417,420,422,425,428,430,432,434],{"class":37,"line":406},17,[35,408,409],{"class":185},"    return",[35,411,157],{"class":41},[35,413,414],{"class":90},"CreateResponse",[35,416,209],{"class":41},[35,418,419],{"class":109},"OK",[35,421,113],{"class":41},[35,423,424],{"class":185},"new",[35,426,427],{"class":41}," { viewCount ",[35,429,154],{"class":68},[35,431,332],{"class":41},[35,433,335],{"class":109},[35,435,436],{"class":41}," });\n",[35,438,440],{"class":37,"line":439},18,[35,441,442],{"class":41},"}\n",[20,444,446],{"id":445},"v2-aspnet-core-mvc-6","v2 (ASP.NET Core \u002F MVC 6)",[25,448,450],{"className":27,"code":449,"language":29,"meta":30,"style":30},"[FunctionName(\"PageView\")]\npublic static async Task\u003CIActionResult> Run(\n    [HttpTrigger(AuthorizationLevel.Anonymous, \"get\")]HttpRequest req, TraceWriter log) {\n    var page = req.Query[\"page\"];\n    if (String.IsNullOrEmpty(page))\n       return new BadRequestObjectResult(\"'page' parameter missing.\");\n\n    var table = Helpers.GetTableReference(\"PageViewCounts\");\n    var pageView = await table.RetrieveAsync\u003CPageViewCount>(\"damieng.com\", page)\n        ?? new PageViewCount(page) { ViewCount = 0 };\n    var operation = pageView.ViewCount == 0\n        ? TableOperation.Insert(pageView)\n        : TableOperation.Replace(pageView);\n    pageView.ViewCount++;\n    await table.ExecuteAsync(operation);\n\n    return new OkObjectResult(new { viewCount = pageView.ViewCount });\n}\n",[32,451,452,468,489,522,545,555,575,579,601,629,645,661,671,681,691,701,705,728],{"__ignoreMap":30},[35,453,454,456,458,460,462,464,466],{"class":37,"line":38},[35,455,42],{"class":41},[35,457,46],{"class":45},[35,459,49],{"class":41},[35,461,53],{"class":52},[35,463,57],{"class":56},[35,465,53],{"class":52},[35,467,62],{"class":41},[35,469,470,472,474,476,478,480,483,485,487],{"class":37,"line":65},[35,471,69],{"class":68},[35,473,72],{"class":68},[35,475,75],{"class":68},[35,477,78],{"class":45},[35,479,81],{"class":41},[35,481,482],{"class":45},"IActionResult",[35,484,87],{"class":41},[35,486,91],{"class":90},[35,488,94],{"class":41},[35,490,491,493,495,497,499,501,503,505,507,509,512,514,516,518,520],{"class":37,"line":97},[35,492,100],{"class":41},[35,494,103],{"class":45},[35,496,106],{"class":41},[35,498,110],{"class":109},[35,500,113],{"class":41},[35,502,53],{"class":52},[35,504,118],{"class":56},[35,506,53],{"class":52},[35,508,123],{"class":41},[35,510,511],{"class":45},"HttpRequest",[35,513,130],{"class":129},[35,515,113],{"class":41},[35,517,135],{"class":45},[35,519,138],{"class":129},[35,521,141],{"class":41},[35,523,524,526,528,530,532,535,537,539,541,543],{"class":37,"line":144},[35,525,148],{"class":147},[35,527,151],{"class":41},[35,529,154],{"class":68},[35,531,157],{"class":41},[35,533,534],{"class":109},"Query",[35,536,42],{"class":41},[35,538,53],{"class":52},[35,540,174],{"class":56},[35,542,53],{"class":52},[35,544,179],{"class":41},[35,546,547,549,551,553],{"class":37,"line":182},[35,548,186],{"class":185},[35,550,189],{"class":41},[35,552,192],{"class":90},[35,554,195],{"class":41},[35,556,557,560,562,565,567,569,571,573],{"class":37,"line":198},[35,558,559],{"class":185},"       return",[35,561,304],{"class":185},[35,563,564],{"class":45}," BadRequestObjectResult",[35,566,49],{"class":41},[35,568,53],{"class":52},[35,570,219],{"class":56},[35,572,53],{"class":52},[35,574,224],{"class":41},[35,576,577],{"class":37,"line":227},[35,578,231],{"emptyLinePlaceholder":230},[35,580,581,583,585,587,589,591,593,595,597,599],{"class":37,"line":234},[35,582,148],{"class":147},[35,584,239],{"class":41},[35,586,154],{"class":68},[35,588,244],{"class":41},[35,590,247],{"class":90},[35,592,49],{"class":41},[35,594,53],{"class":52},[35,596,254],{"class":56},[35,598,53],{"class":52},[35,600,224],{"class":41},[35,602,603,605,607,609,611,613,615,617,619,621,623,625,627],{"class":37,"line":261},[35,604,148],{"class":147},[35,606,266],{"class":41},[35,608,154],{"class":68},[35,610,271],{"class":185},[35,612,274],{"class":41},[35,614,277],{"class":90},[35,616,81],{"class":41},[35,618,282],{"class":45},[35,620,285],{"class":41},[35,622,53],{"class":52},[35,624,290],{"class":56},[35,626,53],{"class":52},[35,628,295],{"class":41},[35,630,631,633,635,637,639,641,643],{"class":37,"line":298},[35,632,301],{"class":68},[35,634,304],{"class":185},[35,636,307],{"class":45},[35,638,310],{"class":41},[35,640,154],{"class":68},[35,642,316],{"class":315},[35,644,319],{"class":41},[35,646,647,649,651,653,655,657,659],{"class":37,"line":322},[35,648,148],{"class":147},[35,650,327],{"class":41},[35,652,154],{"class":68},[35,654,332],{"class":41},[35,656,335],{"class":109},[35,658,338],{"class":68},[35,660,341],{"class":315},[35,662,663,665,667,669],{"class":37,"line":344},[35,664,347],{"class":68},[35,666,350],{"class":41},[35,668,353],{"class":90},[35,670,356],{"class":41},[35,672,673,675,677,679],{"class":37,"line":359},[35,674,362],{"class":68},[35,676,350],{"class":41},[35,678,367],{"class":90},[35,680,370],{"class":41},[35,682,683,685,687,689],{"class":37,"line":373},[35,684,376],{"class":41},[35,686,335],{"class":109},[35,688,381],{"class":68},[35,690,384],{"class":41},[35,692,693,695,697,699],{"class":37,"line":387},[35,694,390],{"class":185},[35,696,274],{"class":41},[35,698,395],{"class":90},[35,700,398],{"class":41},[35,702,703],{"class":37,"line":401},[35,704,231],{"emptyLinePlaceholder":230},[35,706,707,709,711,714,716,718,720,722,724,726],{"class":37,"line":406},[35,708,409],{"class":185},[35,710,304],{"class":185},[35,712,713],{"class":45}," OkObjectResult",[35,715,49],{"class":41},[35,717,424],{"class":185},[35,719,427],{"class":41},[35,721,154],{"class":68},[35,723,332],{"class":41},[35,725,335],{"class":109},[35,727,436],{"class":41},[35,729,730],{"class":37,"line":439},[35,731,442],{"class":41},[20,733,735],{"id":734},"differences","Differences",[10,737,738],{},"The main differences are that:",[740,741,742,756],"ol",{},[743,744,745,746,748,749,752,753,755],"li",{},"Return types are ",[32,747,482],{},"\u002F",[32,750,751],{},"ObjectResult"," objects rather than extension methods against ",[32,754,126],{}," (easier to mock\u002Fcreate custom ones)",[743,757,758,759,761,762,764],{},"Input is the ",[32,760,511],{}," object rather than ",[32,763,84],{}," (easier to get query parameters)",[10,766,767,768,771],{},"The error ",[32,769,770],{},"Can not create abstract class"," when executing your function means you are trying to use the wrong tech for that environment.",[20,773,775],{"id":774},"helpers","Helpers",[10,777,778],{},"Both classes above utilise a small helper class to take care of Table Storage which doesn't have the nicest to use API. A data-context like wrapper that ensures the right types go to the right table might be an even better option.",[25,780,782],{"className":27,"code":781,"language":29,"meta":30,"style":30},"static class Helpers {\n    public static CloudStorageAccount GetCloudStorageAccount() {\n        var connection = ConfigurationManager.AppSettings[\"DamienGTableStorage\"];\n        return connection == null ? CloudStorageAccount.DevelopmentStorageAccount : CloudStorageAccount.Parse(connection);\n    }\n\n    public static CloudTable GetTableReference(string name) {\n        return GetCloudStorageAccount().CreateCloudTableClient().GetTableReference(name);\n    }\n\n    public static async Task\u003CT> RetrieveAsync\u003CT>(this CloudTable cloudTable, string partitionKey, string rowKey)\n        where T:TableEntity {\n        var tableResult = await cloudTable.ExecuteAsync(TableOperation.Retrieve\u003CT>(partitionKey, rowKey));\n        return (T)tableResult.Result;\n    }\n}\n",[32,783,784,799,815,842,874,879,883,905,924,928,932,983,999,1028,1045,1049],{"__ignoreMap":30},[35,785,786,789,792,796],{"class":37,"line":38},[35,787,788],{"class":68},"static",[35,790,791],{"class":185}," class",[35,793,795],{"class":794},"sPLAf"," Helpers",[35,797,798],{"class":41}," {\n",[35,800,801,804,806,809,812],{"class":37,"line":65},[35,802,803],{"class":68},"    public",[35,805,72],{"class":68},[35,807,808],{"class":45}," CloudStorageAccount",[35,810,811],{"class":90}," GetCloudStorageAccount",[35,813,814],{"class":41},"() {\n",[35,816,817,820,823,825,828,831,833,835,838,840],{"class":37,"line":97},[35,818,819],{"class":147},"        var",[35,821,822],{"class":41}," connection ",[35,824,154],{"class":68},[35,826,827],{"class":41}," ConfigurationManager.",[35,829,830],{"class":109},"AppSettings",[35,832,42],{"class":41},[35,834,53],{"class":52},[35,836,837],{"class":56},"DamienGTableStorage",[35,839,53],{"class":52},[35,841,179],{"class":41},[35,843,844,846,848,851,854,857,860,863,866,868,871],{"class":37,"line":144},[35,845,201],{"class":185},[35,847,822],{"class":41},[35,849,850],{"class":68},"==",[35,852,853],{"class":315}," null",[35,855,856],{"class":68}," ?",[35,858,859],{"class":41}," CloudStorageAccount.",[35,861,862],{"class":109},"DevelopmentStorageAccount",[35,864,865],{"class":68}," :",[35,867,859],{"class":41},[35,869,870],{"class":90},"Parse",[35,872,873],{"class":41},"(connection);\n",[35,875,876],{"class":37,"line":182},[35,877,878],{"class":41},"    }\n",[35,880,881],{"class":37,"line":198},[35,882,231],{"emptyLinePlaceholder":230},[35,884,885,887,889,892,895,897,900,903],{"class":37,"line":227},[35,886,803],{"class":68},[35,888,72],{"class":68},[35,890,891],{"class":45}," CloudTable",[35,893,894],{"class":90}," GetTableReference",[35,896,49],{"class":41},[35,898,899],{"class":147},"string",[35,901,902],{"class":129}," name",[35,904,141],{"class":41},[35,906,907,909,911,914,917,919,921],{"class":37,"line":234},[35,908,201],{"class":185},[35,910,811],{"class":90},[35,912,913],{"class":41},"().",[35,915,916],{"class":90},"CreateCloudTableClient",[35,918,913],{"class":41},[35,920,247],{"class":90},[35,922,923],{"class":41},"(name);\n",[35,925,926],{"class":37,"line":261},[35,927,878],{"class":41},[35,929,930],{"class":37,"line":298},[35,931,231],{"emptyLinePlaceholder":230},[35,933,934,936,938,940,942,944,947,949,951,953,956,958,961,963,966,968,970,973,975,977,980],{"class":37,"line":322},[35,935,803],{"class":68},[35,937,72],{"class":68},[35,939,75],{"class":68},[35,941,78],{"class":45},[35,943,81],{"class":41},[35,945,946],{"class":45},"T",[35,948,87],{"class":41},[35,950,277],{"class":90},[35,952,81],{"class":41},[35,954,946],{"class":955},"sAO9U",[35,957,285],{"class":41},[35,959,960],{"class":68},"this",[35,962,891],{"class":45},[35,964,965],{"class":129}," cloudTable",[35,967,113],{"class":41},[35,969,899],{"class":147},[35,971,972],{"class":129}," partitionKey",[35,974,113],{"class":41},[35,976,899],{"class":147},[35,978,979],{"class":129}," rowKey",[35,981,982],{"class":41},")\n",[35,984,985,988,991,994,997],{"class":37,"line":344},[35,986,987],{"class":68},"        where",[35,989,990],{"class":955}," T",[35,992,993],{"class":41},":",[35,995,996],{"class":45},"TableEntity",[35,998,798],{"class":41},[35,1000,1001,1003,1006,1008,1010,1013,1015,1018,1021,1023,1025],{"class":37,"line":359},[35,1002,819],{"class":147},[35,1004,1005],{"class":41}," tableResult ",[35,1007,154],{"class":68},[35,1009,271],{"class":185},[35,1011,1012],{"class":41}," cloudTable.",[35,1014,395],{"class":90},[35,1016,1017],{"class":41},"(TableOperation.",[35,1019,1020],{"class":90},"Retrieve",[35,1022,81],{"class":41},[35,1024,946],{"class":45},[35,1026,1027],{"class":41},">(partitionKey, rowKey));\n",[35,1029,1030,1032,1035,1037,1040,1043],{"class":37,"line":373},[35,1031,201],{"class":185},[35,1033,1034],{"class":41}," (",[35,1036,946],{"class":45},[35,1038,1039],{"class":41},")tableResult.",[35,1041,1042],{"class":109},"Result",[35,1044,384],{"class":41},[35,1046,1047],{"class":37,"line":387},[35,1048,878],{"class":41},[35,1050,1051],{"class":37,"line":401},[35,1052,442],{"class":41},[20,1054,1056],{"id":1055},"to-compile","To compile",[10,1058,1059,1060,1062],{},"If you want to compile this, or Google led you here looking for code to do a simple page counter, here's the missing ",[32,1061,996],{}," class;",[25,1064,1066],{"className":27,"code":1065,"language":29,"meta":30,"style":30},"public class PageViewCount : TableEntity\n{\n    public PageViewCount(string pageName)\n    {\n        PartitionKey = \"damieng.com\";\n        RowKey = pageName;\n    }\n\n    public PageViewCount() { }\n    public int ViewCount { get; set; }\n}\n",[32,1067,1068,1082,1087,1102,1107,1123,1133,1137,1141,1150,1171],{"__ignoreMap":30},[35,1069,1070,1072,1074,1076,1079],{"class":37,"line":38},[35,1071,69],{"class":68},[35,1073,791],{"class":185},[35,1075,307],{"class":794},[35,1077,1078],{"class":41}," : ",[35,1080,1081],{"class":45},"TableEntity\n",[35,1083,1084],{"class":37,"line":65},[35,1085,1086],{"class":41},"{\n",[35,1088,1089,1091,1093,1095,1097,1100],{"class":37,"line":97},[35,1090,803],{"class":68},[35,1092,307],{"class":90},[35,1094,49],{"class":41},[35,1096,899],{"class":147},[35,1098,1099],{"class":129}," pageName",[35,1101,982],{"class":41},[35,1103,1104],{"class":37,"line":144},[35,1105,1106],{"class":41},"    {\n",[35,1108,1109,1112,1114,1117,1119,1121],{"class":37,"line":182},[35,1110,1111],{"class":41},"        PartitionKey ",[35,1113,154],{"class":68},[35,1115,1116],{"class":52}," \"",[35,1118,290],{"class":56},[35,1120,53],{"class":52},[35,1122,384],{"class":41},[35,1124,1125,1128,1130],{"class":37,"line":198},[35,1126,1127],{"class":41},"        RowKey ",[35,1129,154],{"class":68},[35,1131,1132],{"class":41}," pageName;\n",[35,1134,1135],{"class":37,"line":227},[35,1136,878],{"class":41},[35,1138,1139],{"class":37,"line":234},[35,1140,231],{"emptyLinePlaceholder":230},[35,1142,1143,1145,1147],{"class":37,"line":261},[35,1144,803],{"class":68},[35,1146,307],{"class":90},[35,1148,1149],{"class":41},"() { }\n",[35,1151,1152,1154,1157,1160,1162,1165,1168],{"class":37,"line":298},[35,1153,803],{"class":68},[35,1155,1156],{"class":147}," int",[35,1158,1159],{"class":41}," ViewCount { ",[35,1161,118],{"class":147},[35,1163,1164],{"class":41},"; ",[35,1166,1167],{"class":147},"set",[35,1169,1170],{"class":41},"; }\n",[35,1172,1173],{"class":37,"line":322},[35,1174,442],{"class":41},[10,1176,1177],{},[1178,1179,1180],"em",{},"[)amien",[1182,1183,1184],"style",{},"html pre.shiki code .s6Vpi, html code.shiki .s6Vpi{--shiki-default:#5C6A72;--shiki-dark:#F8F8F2}html pre.shiki code .snuxY, html code.shiki .snuxY{--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sciFF, html code.shiki .sciFF{--shiki-default:#8DA101;--shiki-dark:#E9F284}html pre.shiki code .sJQOs, html code.shiki .sJQOs{--shiki-default:#8DA101;--shiki-dark:#F1FA8C}html pre.shiki code .s9HRq, html code.shiki .s9HRq{--shiki-default:#F57D26;--shiki-dark:#FF79C6}html pre.shiki code .sS4Kt, html code.shiki .sS4Kt{--shiki-default:#8DA101;--shiki-dark:#50FA7B}html pre.shiki code .sSKRk, html code.shiki .sSKRk{--shiki-default:#35A77C;--shiki-dark:#F8F8F2}html pre.shiki code .s7cAX, html code.shiki .s7cAX{--shiki-default:#5C6A72;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .sXAHl, html code.shiki .sXAHl{--shiki-default:#3A94C5;--shiki-dark:#FF79C6}html pre.shiki code .smiwp, html code.shiki .smiwp{--shiki-default:#F85552;--shiki-dark:#FF79C6}html pre.shiki code .s3Ipq, html code.shiki .s3Ipq{--shiki-default:#DF69BA;--shiki-dark:#BD93F9}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sPLAf, html code.shiki .sPLAf{--shiki-default:#3A94C5;--shiki-dark:#8BE9FD}html pre.shiki code .sAO9U, html code.shiki .sAO9U{--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}",{"title":30,"searchDepth":65,"depth":65,"links":1186},[1187,1188,1189,1190,1191],{"id":22,"depth":65,"text":23},{"id":445,"depth":65,"text":446},{"id":734,"depth":65,"text":735},{"id":774,"depth":65,"text":775},{"id":1055,"depth":65,"text":1056},"Development","2018-03-29T11:07:00-08:00","[object Object]","md",null,false,{},"\u002Fblog\u002F2018\u002Fazure-functions-differences-v1-v2",{"title":5,"description":12},"blog\u002F2018\u002Fazure-functions-differences-v1-v2",[1203,1204,1205],".NET","Azure","C#","\u002Fblog\u002F2018\u002Fazure-functions-differences-v1-v2\u002F",740,"4ZpuleZWyHPxM6Zng22E6wtctFFJgOhfXuJ9yIhB8Sw",[1210,1214,1218],{"title":1211,"date":1212,"url":1213},"Transactions in the MongoDB EF Core Provider","2025-10-25","\u002Fblog\u002F2025\u002Fmongodb-explicit-transactions\u002F",{"title":1215,"date":1216,"url":1217},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","\u002Fblog\u002F2025\u002Fmongodb-queryable-encryption\u002F",{"title":1219,"date":1220,"url":1221},"Lazy Loading with EF Core Proxies","2025-04-02","\u002Fblog\u002F2025\u002Fef-proxies\u002F",[],1780900526282]