Linq.js for Dynamics 365 Developers
Recently I was working in some large JSON objects in client side javascript where I had to query through it several times as per requirement I was using javascript array’s functions. Then I thought why not use lodash.js or underscore.js I checked over github they are really feature rich and trustworthy, but there was a whole new list of functions and syntax to learn.
Then after few more google search I got sevearal javascript libraries with LINQ like syntax, after comparing I found linq.js most promising and even size is lesser when comparing to lodash and underscore.
Library
GZipped size
lodash
~ 24 KB
linq.js
~ 7 KB
underscore
~ 6.6 KB
linq.js github project link -> https://github.com/mihaifm/linq
With Linq.js dynamics 365 developers can use their existing knowledge of LINQ in javascript code whith nominal changes. see below examples from their github
// C# LINQ - delegate
Enumerable.Range(1, 10)
.Where(delegate(int i) { return i % 3 == 0; })
.Select(delegate(int i) { return i * 10; });
// linq.js - anonymous function
Enumerable.range(1, 10)
.where(function(i) { return i % 3 == 0; })
.select(function(i) { return i * 10; });
// C# LINQ - lambda
Enumerable.Range(1, 10).Where(i => i % 3 == 0).Select(i => i * 10);
// linq.js - arrow function
Enumerable.range(1, 10).where(i => i % 3 == 0).select(i => i * 10);
// C# LINQ - anonymous type
array.Select((val, i) => new { Value = val, Index = i });
// linq.js - object literal
Enumerable.from(array).select((val, i) => ({ value: val, index: i}));
Example with Dynamics 365/CRM
Let’s retrieve some data from CRM and query in client side javascript. First of all download and save linq.min.js as a javascript webresource, and save below code as html webresource and change your linq.js webresource name accordingly.
<head>
<title>Trying linq.js</title>
<script src="/WebResources/new_linq.js" type="text/javascript"></script>
<script src="ClientGlobalContext.js.aspx" type="text/javascript"></script>
<script>
// to bypass a product bug, ignore this
window["ENTITY_SET_NAMES"] = window["ENTITY_SET_NAMES"] || '{ "account" : "accounts"}';
// retrieving accoount records
Xrm.WebApi.retrieveMultipleRecords("account").then(
function(result) {
debugger;
console.log(result);
// storing all the records to var accounts
var accounts = result.entities;
// build query filter all records with address1_city == "Redmond"
var accountsCityRedmond = Enumerable.from(accounts).where(a => a.address1_city == "Redmond");
// use toArray(); to evaluate the query
console.log(accountsCityRedmond.toArray());
// previously built query can be filtered even further
var accountsCityRedmondCountryColumbia = accountsCityRedmond.where(a => a.address1_country == "Columbia").select(w => w.websiteurl);
// and can be evaluated anytime with .toArray()
console.log(accountsCityRedmondCountryColumbia.toArray());
},
function(error) {
console.log(error.message);
}
);
</script>
</head>
Run above HTML web resource in browser & press F12 to see output, it would be similar to below shown output, I have run this code in newly created trial instance of dynamics 365.
Go through code comments to understand it better.

Hope it helps. Feel free to ask any questons.
Comments
Join the discussionNo comments yet. Be the first to comment.
