{"id":213,"date":"2017-05-10T07:27:05","date_gmt":"2017-05-10T14:27:05","guid":{"rendered":""},"modified":"2025-06-11T08:14:01","modified_gmt":"2025-06-11T15:14:01","slug":"announcing-the-cds-sdk-preview","status":"publish","type":"post","link":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/announcing-the-cds-sdk-preview\/","title":{"rendered":"Announcing the Common Data Service SDK Preview (Previous Version)"},"content":{"rendered":"<p>Thanks for coming!\u00a0 Today it&#8217;s our pleasure to tell you more about the Common Data Service SDK.\u00a0 We&#8217;ve been talking about this in some select circles for the past few months and today we&#8217;re here to share this info with all this with our broader community! \u00a0<\/p>\n<p>The Common Data Service provides a lot of benefits to our customers (to learn more about the Common Data Service in general, please see <a href=\"https:\/\/powerapps.microsoft.com\/en-us\/blog\/another-look-at-the-common-data-service\/\"><u>this blog post<\/u><\/a> from April 2017).\u00a0 One of the most tangible benefits of the CDS is that it allows data from many disparate sources to be integrated into a single data model. This data, however, is only useful when you can build apps on it for your company. To provide customers with even more meaningful ways to build apps, we are releasing the Common Data Service SDK. This SDK allows you to create, read, update, delete (CRUD) and even query your business data residing in the Common Data Service. \u00a0<\/p>\n<p>Alright.\u00a0 With that out of the way, I&#8217;d like to introduce Peter Villadsen who will take you on a quick tour of the SDK in the rest of this blog post.\u00a0 And for reference, you can learn all the details about the SDK <a href=\"https:\/\/docs.microsoft.com\/en-us\/common-data-service\/entity-reference\/cds-sdk-get-started\">here<\/a>.<\/p>\n<p>\u00a0<\/p>\n<h1><strong>The Common Data Service SDK\u00a0<\/strong><\/h1>\n<p>Hello!\u00a0 I&#8217;m Peter Villadsen and I am the Program Manager owner of the CDS SDK!\u00a0 I&#8217;m extremely excited to talk with you today about our SDK.\u00a0 But before we get into the details, let&#8217;s set some context.<\/p>\n<h2><strong>Underlying Architecture<\/strong><\/h2>\n<p>In order to understand the role of the SDK with CDS, it is useful to first understand a little of the underlying architecture. All work accessing the data is done on the server tier \u2013 the client tier where the SDK code is running merely instructs the server what to do, and transports data to and from the server. The client and the server tiers communicate through JSON documents that describe the operations required. The server tier does not really care where these documents come from, so you can get to your business data in a variety of ways.<\/p>\n<p>In principle you could build perfectly viable applications by building the JSON documents with string operations and using standard HTTP protocols to transmit them over the wire to the Common Data System endpoints. While this may be viable on severely constrained client devices, you will probably prefer using an API at a higher abstraction level, offering a strong type system to help you at design time rather than running the risk of failing at runtime. The role of the SDK is simply to generate the JSON documents representing the operations that the user specifies from the code the user writes. Therefore, the SDK is a relatively thin layer, and in principle an SDK can be written in any language running on any platform that supports an HTTP stack. Microsoft ships SDKs for managed languages, like C# and Visual Basic, and for JavaScript.\u00a0 It is useful to think of these SDKs as domain-specific languages (DSLs) implemented in their host languages. That is, sub languages useful for developing business applications. In the rest of this blog, we will be using the managed version of the SDK, and we will be presenting examples in C#.<\/p>\n<p>The DSLs that we are providing are not tied to any particular data storage paradigm. While the relational data model has served well for around half a century (ever since Codd released his seminal work in 1969), there are now ways to organize data that are not based on rows and columns. There are some scenarios, like representing social networks or advanced bill of materials, that may benefit from representing data as graphs containing nodes and edges and others where the more natural representation is as documents. The SDK will leverage the benefits provided by those data paradigms naturally and effectively as well. In this blog we will be dealing only with the relational model.<\/p>\n<h2><strong>Examples<\/strong><\/h2>\n<p>The functionality we&#8217;re shipping with the SDK is the result of many years of experience building extensive development solutions for complex business domains such as Enterprise Resource Planning (ERP). We have designed the SDK to make it as easy as possible to implement effective, fast systems, while at the same time discouraging ineffective ways of doing things. Also, security is vital to any data usage in the enterprise, and security is baked into the Common Data Service by default. The security is not managed by the SDKs that we are describing here. Instead, it is set up centrally the administrative portal, and then applies to usage of the data, through any apps including apps that use the SDK.<\/p>\n<p>In the terminology of the SDK, tables are called entitysets, as opposed to entities. Entities are in turn the records in the entitysets. The Common Data System ships with a large number of predefined entitysets out of the box.\u00a0 You can learn more about the common data model and entities <a href=\"https:\/\/docs.microsoft.com\/en-us\/common-data-service\/entity-reference\/common-data-model\">here<\/a>. Should you still need to define your own, rather than use or extend one of the existing ones, you can use <a href=\"https:\/\/web.powerapps.com\/\"><u>powerapps.com<\/u><\/a> to define entities and the relationships between them.\u00a0<\/p>\n<p>Now that we&#8217;ve talked through a bit of the underlying architecture, let&#8217;s look at how you can use the SDK to interact with data in the Common Data Service.<\/p>\n<h3><strong>Inserting data<\/strong><\/h3>\n<p>Let us look at some code that inserts product categories into the database.<\/p>\n<p><strong>using<\/strong> System;<br \/>\n<strong>using<\/strong> System.Collections.Generic;<br \/>\n<strong>using<\/strong> System.Linq;<br \/>\n<strong>using<\/strong> System.Text;<br \/>\n<strong>using<\/strong> System.Threading.Tasks;<\/p>\n<p><strong>namespace<\/strong> SdkConsoleApp<br \/>\n{<br \/>\n\u00a0\u00a0\u00a0 <em>\/\/ Include the namespaces for readability<\/em><br \/>\n\u00a0\u00a0\u00a0 <strong>using<\/strong> Microsoft.CommonDataService;<br \/>\n\u00a0\u00a0\u00a0 <strong>using<\/strong> Microsoft.CommonDataService.CommonEntitySets;<br \/>\n\u00a0\u00a0\u00a0 <strong>using<\/strong> Microsoft.CommonDataService.Configuration;<br \/>\n\u00a0\u00a0\u00a0 <strong>using<\/strong> Microsoft.CommonDataService.ServiceClient.Security;<\/p>\n<p>\u00a0\u00a0\u00a0 <strong>using<\/strong> System.Threading.Tasks; <em>\/\/ Needed for async<\/em><\/p>\n<p>\u00a0\u00a0\u00a0 <strong>class<\/strong> Program<br \/>\n\u00a0\u00a0\u00a0 {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>private<\/strong> <strong>static<\/strong> async Task InsertAsync(Client client)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <em>\/\/ Insert Surface and Phone product lines<\/em><br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var surfaceCategory = <strong>new<\/strong> ProductCategory()<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Name = &#8220;Surface&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Description = &#8220;Surface product line&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var phoneCategory = <strong>new<\/strong> ProductCategory()<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Name = &#8220;Phone&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Description = &#8220;Phone product line&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var executor = client.CreateRelationalBatchExecuter(<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RelationalBatchExecutionMode.Transactional);<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 executor<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .Insert(surfaceCategory)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .Insert(phoneCategory);<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 await executor.ExecuteAsync();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>static<\/strong> void Main(string[] args)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>using<\/strong> (var client = ConnectionSettings.Instance.CreateClient().Result)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Task.Run(async () =&gt; await InsertAsync(client));<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.Console.ReadLine();<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n}<\/p>\n<p>Typically you access the SDK through assemblies that are managed via <a href=\"https:\/\/docs.microsoft.com\/nuget\/\"><u>NuGet<\/u><\/a>. This makes it easy to keep up to date with the newest versions, since Visual Studio will download the newest versions and their dependencies from the NuGet repository automatically.<\/p>\n<p>Because this example is a console application, execution will start in the static Main mathod. The first thing we need to do to talk to the data is to authenticate the user against Azure Active Directory. In this case we do that through the call to <strong>CreateClient<\/strong>, which will access information held in a config file called App.config. This file contains information about the Application Id, which is the Id that Azure assigned for your application, and the environmentId that defines which database you wish to access. Once that is all done, you will have a valid client instance to work with.<\/p>\n<p>The client instance is the gateway for all data operations. The Client type implements <strong>IDisposable<\/strong>, so it is good practice to use it in a <strong>using<\/strong> statement, so that it will be disposed of as quickly as possible. In this case we pass the client instance to the <strong>InsertAsync<\/strong> method that will actually do the work. There are a few things to note here before we go into the details of the <strong>InsertAsync<\/strong> method. First, the method naming: The method has an <strong>Async<\/strong> suffix and that is a convention that you should always adhere to when a method is asynchronous. As you will see, almost all the methods provided by the SDK are available as asynchronous methods, which is crucial to using resources properly. If you need a brush up on your async skills you can refer to <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/mt674882.aspx\"><u>Asynchronous Programming with async and await (C#)<\/u><\/a>. In our case the <strong>InsertAsync<\/strong> method does not return a meaningful value, so its return type is simply <strong>Task<\/strong>. When you want to return values, you return a <strong>Task<\/strong> with the required resulting type as a generic type parameter.<\/p>\n<p>The first thing we do in our example above is to create instances of the product categories that we wish to insert into our <strong>ProductCategory<\/strong> entityset. You will notice that the types representing entitysets are merely C# classes without much fanfare, what is called Plain Old C# Objects or simply POCOs in nerd argot. All the out-of-box entities are available to use in this way, and you can define the POCOs yourself if you have to, as long as they match up with the definition in the maker portal.<\/p>\n<p>Once the entities (i.e. the records, or POCOs) are created they are ready to be inserted into the database. As you know, this sort of operation is usually done inside the context of a transaction; however, in the SDK the concept of transactions does not exist! What happens instead is that you add all the entities to an executor (these is what happens in the insert calls). However, these calls only register the entities for insertion later, namely when the <strong>ExecuteAsync<\/strong> call is made. At this point the entities are serialized on the client side, then sent over the wire to the server. The server layer will deserialize the entities, start a transaction, insert the records, and commit the transaction. As you see, the burden of managing the transaction falls on the system, not on you. This is one of the lessons we took away from the decades of experience from writing code for the Dynamics 365 for Operations platform, where managing transaction was always a source of problems.<\/p>\n<h3><strong>Querying data<\/strong><\/h3>\n<p>Above we introduced a lot of concepts that will help us understand how to query data residing in the relational database.<\/p>\n<p><strong>static<\/strong> async Task SimpleSelectAsync(Client client)<br \/>\n{<br \/>\n\u00a0\u00a0\u00a0 var queryBuilder = client.GetRelationalEntitySet&lt;ProductCategory&gt;()<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .CreateQueryBuilder();<\/p>\n<p>\u00a0\u00a0\u00a0 var query = queryBuilder<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .Where(pc =&gt; pc.Name == &#8220;Electronics&#8221;)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .OrderByAscending(pc =&gt; <strong>new<\/strong> object[] { pc.CategoryId })<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .Project(pc =&gt; pc.SelectField(f =&gt; f.CategoryId)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .SelectField(f =&gt; f.Name)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .SelectField(f =&gt; f.Description));<\/p>\n<p>\u00a0\u00a0\u00a0 <em>\/\/ Execute the query:<\/em><br \/>\n\u00a0\u00a0\u00a0 OperationResult&lt;IReadOnlyList&lt;ProductCategory&gt;&gt; queryResult = <strong>null<\/strong>;<br \/>\n\u00a0\u00a0\u00a0 var executor = client.CreateRelationalBatchExecuter(<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RelationalBatchExecutionMode.Transactional)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .Query(query, <strong>out<\/strong> queryResult);<\/p>\n<p>\u00a0\u00a0\u00a0 await executor.ExecuteAsync();<\/p>\n<p>\u00a0\u00a0\u00a0 <strong>foreach<\/strong> (var pc <strong>in<\/strong> queryResult.Result)<br \/>\n\u00a0\u00a0\u00a0 {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(pc.Name);<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n}<\/p>\n<p>The code above queries the <strong>ProductCategory<\/strong> entityset for entities satisfying certain requirements. First, as before, the client is used to provide the functionality to access the data. In this example the client is used to create a <strong>Query<\/strong> builder over the entityset provided as the generic type parameter. This query is then enhanced by adding a where clause,talking about which entities we are looking for. In this case, we are looking for product categories that have the name &#8220;Electronics&#8221;. It is important to understand that the <strong>where<\/strong> expression is expressed as a lambda function from the entityset type onto boolean. At runtime the compiler will create a tree for this function, and that tree is materialized in the documemnt that describes the query. In fact, the function provided is never actually run, it is only used to provide the definition of the where clause. Using lambda functions has other advantages: The compiler can diagnose problems cause by type violations, and capable editors can provide IntelliSense to aid the development experience.<\/p>\n<p>This technique is reused in the clause that specifies the order in which the records are required. Here the lambda maps a <strong>ProductCategory<\/strong> onto an array of objects. This is because there can be any number of fields to sort by, obviously, but again, no array is ever created! We then want to specify what fields we want to project, i.e. the fields we want populated from the database. Note, there is no option for specifying &#8220;all fields&#8221;, since misuse caused performance issues in other systems. You have to specify each field individually. Here the calls to <strong>SelectField<\/strong> are chained together to specify the list of three fields.<\/p>\n<p>Now the query has been specified, but it has not been run. For this we need an executer, just like before. As you can see, we have specified the resulting type of the query explicitly, as a readonly list of ProductCategory entities. Sometimes it becomes cumbersome to describe the resulting type. In those cases, it it useful to use the <strong>CreateqQueryResultType<\/strong> function, that just returns <strong>null<\/strong>, but typed correctly as defined by the query.<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var queryResult = query.CreateQueryResultType();<\/p>\n<h2><strong>OK. What&#8217;s next?<\/strong><\/h2>\n<p>We hope that the information in this blog has been useful in helping you to understand some of the initial capabilities of the Common Data Service SDK.\u00a0 If you are interested in getting early access to the SDK by participating in the preview program, please contact us at <a href=\"mailto:cdspreviewprogs@microsoft.com\">cdspreviewprogs_at_microsoft.com.<\/a>\u00a0 You can learn a lot more about the SDK and keep up to date with the latest developments by visiting our documentation site <a href=\"https:\/\/docs.microsoft.com\/en-us\/common-data-service\/entity-reference\/cds-sdk-home-page\">here<\/a>.<\/p>\n<p>Thanks!<\/p>\n<p>Peter<\/p>\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We are extremely excited to tell you more about the Common Data Service SDK!\u00a0 We&#8217;ve been talking about this in some select circles for the past few months and today we&#8217;re here to share more info on all this with our broader community!\u00a0 <\/p>\n","protected":false},"author":142,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ms_queue_id":[],"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","_alt_title":"","ms-ems-related-posts":[],"footnotes":""},"audience":[3378],"content-type":[3424],"job-role":[],"product":[3473],"property":[],"topic":[],"coauthors":[2106],"class_list":["post-213","post","type-post","status-publish","format-standard","hentry","audience-it-professional","content-type-news","product-power-apps"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Announcing the Common Data Service SDK Preview (Previous Version) - Microsoft Power Platform 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.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Announcing the Common Data Service SDK Preview (Previous Version) - Microsoft Power Platform Blog\" \/>\n<meta property=\"og:description\" content=\"We are extremely excited to tell you more about the Common Data Service SDK!\u00a0 We&#039;ve been talking about this in some select circles for the past few months and today we&#039;re here to share more info on all this with our broader community!\u00a0\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/announcing-the-cds-sdk-preview\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Power Platform Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-10T14:27:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-11T15:14:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2023\/12\/Microsoft-logo_rgb_c-gray_950-1.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"950\" \/>\n\t<meta property=\"og:image:height\" content=\"413\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jono Luk\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jono Luk\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/\"},\"author\":[{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/jono-luk\/\",\"@type\":\"Person\",\"@name\":\"Jono Luk\"}],\"headline\":\"Announcing the Common Data Service SDK Preview (Previous Version)\",\"datePublished\":\"2017-05-10T14:27:05+00:00\",\"dateModified\":\"2025-06-11T15:14:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/\"},\"wordCount\":2164,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\"},\"keywords\":[\"Developer\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/\",\"name\":\"Announcing the Common Data Service SDK Preview (Previous Version) - Microsoft Power Platform Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website\"},\"datePublished\":\"2017-05-10T14:27:05+00:00\",\"dateModified\":\"2025-06-11T15:14:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Announcing the Common Data Service SDK Preview (Previous Version)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\",\"name\":\"Microsoft Power Platform Blog\",\"description\":\"Innovate with Business Apps\",\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\",\"name\":\"Microsoft Power Platform Blog\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"width\":194,\"height\":145,\"caption\":\"Microsoft Power Platform Blog\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/person\/bb5edbc9bd19b7a2a15496d140242bc1\",\"name\":\"Jono Luk\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/2ba55446f4660987c250c944623c9af207c3c6196a6952884ba0fee4f7e0404a?s=96&d=mm&r=g705b01a7a4bce377c370b6571ba749e0\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2ba55446f4660987c250c944623c9af207c3c6196a6952884ba0fee4f7e0404a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2ba55446f4660987c250c944623c9af207c3c6196a6952884ba0fee4f7e0404a?s=96&d=mm&r=g\",\"caption\":\"Jono Luk\"},\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/jluk\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Announcing the Common Data Service SDK Preview (Previous Version) - Microsoft Power Platform 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.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/","og_locale":"en_US","og_type":"article","og_title":"Announcing the Common Data Service SDK Preview (Previous Version) - Microsoft Power Platform Blog","og_description":"We are extremely excited to tell you more about the Common Data Service SDK!\u00a0 We've been talking about this in some select circles for the past few months and today we're here to share more info on all this with our broader community!\u00a0","og_url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/announcing-the-cds-sdk-preview\/","og_site_name":"Microsoft Power Platform Blog","article_published_time":"2017-05-10T14:27:05+00:00","article_modified_time":"2025-06-11T15:14:01+00:00","og_image":[{"width":950,"height":413,"url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2023\/12\/Microsoft-logo_rgb_c-gray_950-1.webp","type":"image\/png"}],"author":"Jono Luk","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jono Luk","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#article","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/"},"author":[{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/jono-luk\/","@type":"Person","@name":"Jono Luk"}],"headline":"Announcing the Common Data Service SDK Preview (Previous Version)","datePublished":"2017-05-10T14:27:05+00:00","dateModified":"2025-06-11T15:14:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/"},"wordCount":2164,"commentCount":0,"publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization"},"keywords":["Developer"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/","name":"Announcing the Common Data Service SDK Preview (Previous Version) - Microsoft Power Platform Blog","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website"},"datePublished":"2017-05-10T14:27:05+00:00","dateModified":"2025-06-11T15:14:01+00:00","breadcrumb":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2017\/05\/10\/announcing-the-cds-sdk-preview\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/"},{"@type":"ListItem","position":2,"name":"Announcing the Common Data Service SDK Preview (Previous Version)"}]},{"@type":"WebSite","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/","name":"Microsoft Power Platform Blog","description":"Innovate with Business Apps","publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization","name":"Microsoft Power Platform Blog","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","contentUrl":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","width":194,"height":145,"caption":"Microsoft Power Platform Blog"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/person\/bb5edbc9bd19b7a2a15496d140242bc1","name":"Jono Luk","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/2ba55446f4660987c250c944623c9af207c3c6196a6952884ba0fee4f7e0404a?s=96&d=mm&r=g705b01a7a4bce377c370b6571ba749e0","url":"https:\/\/secure.gravatar.com\/avatar\/2ba55446f4660987c250c944623c9af207c3c6196a6952884ba0fee4f7e0404a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2ba55446f4660987c250c944623c9af207c3c6196a6952884ba0fee4f7e0404a?s=96&d=mm&r=g","caption":"Jono Luk"},"url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/jluk\/"}]}},"bloginabox_animated_featured_image":null,"bloginabox_display_generated_audio":false,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Power Platform Blog","distributor_original_site_url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/users\/142"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/comments?post=213"}],"version-history":[{"count":1,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/213\/revisions"}],"predecessor-version":[{"id":131272,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/213\/revisions\/131272"}],"wp:attachment":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/media?parent=213"}],"wp:term":[{"taxonomy":"audience","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/audience?post=213"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/content-type?post=213"},{"taxonomy":"job-role","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/job-role?post=213"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/product?post=213"},{"taxonomy":"property","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/property?post=213"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/topic?post=213"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/coauthors?post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}