MscrmTools.FluentQueryExpressions
MscrmTools.FluentQueryExpressions copied to clipboard
A library to create QueryExpression the fluent way
MscrmTools.FluentQueryExpressions
A library to create QueryExpression the fluent way
You can rely on :
- EarlyBoundGenerator from Daryl LaBar to create the Early Bound Entities to be used with this project (optional)
- LateBoundConstantsGenerator from Jonas Rapp to create Late Bound constants to be used with this projet (optional)
What's new on version 2
Lambda expressions everywhere for Early Bound queries
No more mix between Late Bound and Early Bound queries
Code is fully documented
Performance optimizations for GetFirst, GetFirstOrDefault, GetSingle, GetSingleOrDefault, GetLast and GetLastOrDefault methods
⚠ Not compatible with v1. v1 was allowing mix of Late Bound and Early Bound entities, which is not the case with this version
Query properties
var earlyBoundQuery = new Query<Account>()
.Top(10)
.Distinct()
.NoLock()
.SetPagingInfo(1, 100, true);
var lateBoundQuery = new Query("account")
.Top(10)
.Distinct()
.NoLock()
.SetPagingInfo(1, 100, true);
Selecting fields
var earlyBoundQuery = new Query<Account>()
.Select(a => a.AccountNumber);
var earlyBoundQuery2 = new Query<Account>()
.Select(a => new { a.Name, a.AccountNumber});
var lateBoundQuery = new Query("account")
.Select("name", "accountnumber");
Adding conditions
var earlyBoundQuery = new Query<Account>()
.Select(a => new { a.Name, a.AccountNumber})
.WhereEqual(a => a.Address1_City, "Paris");
var lateBoundQuery = new Query("account")
.Select("name", "accountnumber")
.WhereEqual("address1_city", "Paris");
Adding filters
var earlyBoundQuery = new Query<Account>()
.Select(a => new { a.Name, a.AccountNumber})
.AddFilter(f => f
.SetLogicalOperator(LogicalOperator.Or)
.WhereEqual(a => a.Address1_City, "Paris")
.WhereEqual(a => a.Address1_City, "Nantes")
);
var lateBoundQuery = new Query("account")
.Select("name", "accountnumber")
.AddFilter(new Filter(LogicalOperator.Or)
.WhereEqual("address1_city", "Paris")
.WhereEqual("address1_city", "Nantes")
);
Comparing Columns (online only, from 2020 July 1st)
var earlyBoundQuery = new Query<Account>()
.Select(a => new { a.Name, a.AccountNumber})
.Compare(a => a.CreatedOn).LessThan(a => a.ModifiedOn);
var lateBoundQuery = new Query("account")
.Select("name", "accountnumber")
.Compare("createdon").LessThan("modifiedon");
Adding link entity
var earlyBoundQuery = new Query<Account>()
.Select(a => new { a.Name, a.AccountNumber})
.AddLink<Contact>(a => a.AccountId, c => c.ParentCustomerId, l => l
.SetAlias("cont")
.Select(c => c.Fullname)
.SetLogicalOperator(LogicalOperator.Or)
.WhereEqual(c => c.Address1_City, "Paris")
.WhereEqual(c => c.Address1_City, "Nantes")
, JoinOperator.LeftOuter)
);
var lateBoundQuery = new Query("account")
.Select("name", "accountnumber")
.AddLink(new Link(Contact.EntityLogicalName, Contact.Fields.ParentCustomerId, Account.Fields.AccountId, JoinOperator.LeftOuter)
.SetAlias("cont")
.Select("fullname")
.WhereEqual("address1_city", "Paris")
.WhereEqual("address1_city", "Nantes")
);
Adding order
var earlyBoundQuery = new Query<Account>()
.Select(a => new { a.Name, a.AccountNumber})
.OrderBy(a => a.Name);
var earlyBoundQuery2 = new Query<Account>()
.Select(a => new { a.Name, a.AccountNumber})
.OrderByDescending(a => a.Name);
var lateBoundQuery = new Query("account")
.Select("name", "accountnumber")
.OrderBy("name");
var lateBoundQuery2 = new Query("account")
.Select("name", "accountnumber")
.OrderByDescending("name");
Executing query
Invoke RetrieveMultiple method on IOrganizationService with the query or use one of the method to get records
iOrganizationService.RetrieveMultiple(new Query("account"));
List<Account> records = new Query<Account>().GetAll(iOrganizationService);
Account record = new Query<Account>().GetFirst(iOrganizationService);
Account record = new Query<Account>().GetFirstOrDefault(iOrganizationService);
Account record = new Query<Account>().GetLast(iOrganizationService);
Account record = new Query<Account>().GetLastOrDefault(iOrganizationService);
Account record = new Query<Account>().GetSingle(iOrganizationService);
Account record = new Query<Account>().GetSingleOrDefault(iOrganizationService);
EntityCollection records = new Query<Account>().GetRecords(iOrganizationService);