Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Starcounter/Starcounter.Linq · GitHub
Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Starcounter/Starcounter.Linq · GitHub
Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Starcounter/Starcounter.Linq · GitHub
Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Starcounter/Starcounter.Linq · GitHub
Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Starcounter/Starcounter.Linq · GitHub
Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Starcounter/Starcounter.Linq · GitHub
Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Starcounter/Starcounter.Linq · GitHub
Skip to content

Repository files navigation

Starcounter.Linq

Starcounter.Linq is a LINQ to SQL Provider for Starcounter. It uses standard LINQ syntax for queries.

It is available for downloading as Starcounter.Linq NuGet package.

Versioning

Starcounter.Linq versionsSupported Starcounter version
1.*2.3.1, 2.3.2
2.*2.4
3.*Nova

How to use

First, in your Starcounter app, add a reference to Starcounter.Linq.dll through NuGet: Install-Package Starcounter.Linq.

DbLinq static class defined in Starcounter.Linq namespace should be used as starting point when you want to build LINQ queries. It contains two important methods: Objects<T> and CompileQuery<T> (many overloaded ones) which are used for two different approaches. For example:

// ad-hoc requestvarjohns=DbLinq.Objects<Person>().Where(p =>p.Name=="John");// request using compiled queryvarpeopleByNameQuery=DbLinq.CompileQuery((stringname)=>DbLinq.Objects<Person>().Where(p =>p.Name==name));varjennifers=peopleByNameQuery("Jennifer");

Ad-hoc requests

With this approach, you build a LINQ expression and obtain data as usual when an application needs it.

DbLinq.Objects<T>() returns a data context Queryable<T> which can be used for obtaining data.

The LINQ expression is translated to SQL every time it's called if DbLinq.Objects<T>() is called. This is an expensive operation. Thus, don't use DbLinq.Objects<T>() in places where it's executed many times.

Example:

// this method is rarely used, so we can use ad-hoc requests herevoidHandle(Input.DeleteGroupTriggeraction){Db.Transact(()=>{varsurfaces=DbLinq.Objects<WebTemplate>().Where(x =>x.WebTemplateGroup==this.Data);foreach(WebTemplatesurfaceinsurfaces){surface.WebTemplateGroup=null;}this.Data.Delete();});}

Compiled query

Compiled query lets you build a LINQ expression with translated SQL once and use it many times.

DbLinq.CompileQuery<T> returns a delegate Func<IEnumerable<T>> which can be invoked to execute the compiled query. It has many overloads and it supports passing parameters.

Use DbLinq.CompileQuery<T>() in places where the query will be executed many times since it only translates the LINQ statement to SQL one time which makes subsequent calls fast.

Example:

partialclassSurfacePage:Json{privatestaticreadonlyFunc<IEnumerable<WebTemplate>>SurfaceGroupsQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<WebTemplateGroup>().Where(x =>!x.Deleted));privatestaticreadonlyFunc<WebTemplate,IEnumerable<WebUrl>>RoutesQuery=DbLinq.CompileQuery((WebTemplatesurface)=>DbLinq.Objects<WebUrl>().Where(x =>!x.Deleted&&!x.Hidden).Where(x =>x.Template==surface).OrderBy(x =>x.SortNumber));/* ... */// this method is often called, so we should use compiled queriespublicvoidRefreshData(){this.SurfaceGroups.Data=SurfaceGroupsQuery();this.Routes.Data=RoutesQuery(this.Data);}}

Compiled queries are more restricted than ad-hoc requests since it represents a pre-translated SQL and should support passing parameters. Read more about the restrictions below.

Restrictions

Database fields

Starcounter.Linq only supports database properties. It is not possible to get access to fields.

Example:

// throws System.MissingFieldException since Name is a fieldDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.Name);// works well since SortNumber is defined as propertyDbLinq.Objects<WebTemplateGroup>().OrderBy(x =>x.SortNumber);

The exception will be thrown when calling the method which contains the query definition, which means that the exception will not be thrown from Starcounter.Linq code.

Take and Skip methods

Starcounter.Linq uses literal values for FETCH and OFFSET clauses for performance reason, it means that you cannot pass the value when executing a compiled query.

Example:

// works wellvarpeople=DbLinq.Objects<Person>().Take(10).Skip(20).ToList();// does not workvarquery=DbLinq.CompileQuery((inttake,intskip)=>DbLinq.Objects<Person>().Take(take).Skip(skip));people=query(10,20);// works wellvarquery=DbLinq.CompileQuery(()=>DbLinq.Objects<Person>().Take(10).Skip(20));people=query();

NULL values

Since comparisons with null values are translated to IS NULL form in SQL, there is no possibility to pass such values with parameters into compiled queries. Starcounter.Linq throws an exception in such cases.

Example:

Officeoffice=GetOffice();// can be nullOfficenoOffice=null;// ad-hoc requests works well without restrictionsvaremployee1=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null);varemployee2=DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==office);// works wellvarwithoutOfficeQuery=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office!=null));varwithoutOfficeQuery2=DbLinq.CompileQuery(()=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==noOffice));varwithOfficeQuery=DbLinq.CompileQuery((notNullOffice)=>DbLinq.Objects<Employee>().FirstOrDefault(p =>p.Office==notNullOffice));// it does not work because the SQL query has been translated and IS NULL cannot be insertedemployee1=withOfficeQuery(null);// ArgumentNullException will be thrown// that should be written in the following wayemployee1=office==null?withoutOfficeQuery():withOfficeQuery(office);

Contains method

The Contains method is supported by ad-hoc requests but not by compiled queries.

Example:

varages=new[]{41,42,43};varperson=Objects<Person>().FirstOrDefault(p =>ages.Contains(p.Age));

Deleting data

Deleting data is supported by ad-hoc requests but not by compiled queries.

Example:

Objects<Person>().Delete(x =>x.Age>40);Objects<Person>().DeleteAll();

Supported features

  • SELECT clause, also by using IQueryable.Select method
  • WHERE clause by using methods:
    • IQueryable.Where
    • IQueryable.First
    • IQueryable.FirstOrDefault
    • IQueryable.Single
    • IQueryable.SingleOrDefault
    • IQueryable.Count
    • IQueryable.Any
  • ORDER BY clause by using methods:
    • IQueryable.OrderBy
    • IQueryable.OrderByDescending
    • IQueryable.ThenBy
    • IQueryable.ThenByDescending
  • GROUP BY clause by using IQueryable.GroupBy method. Aggregation is required by using one of the following methods inside of IQueryable.Select one:
    • IEnumerable.Count
    • IEnumerable.LongCount
    • IEnumerable.Average
    • IEnumerable.Min
    • IEnumerable.Max
    • IEnumerable.Sum
  • Logical operators AND, OR, NOT by using &&, ||, ! operators in LINQ queries
  • Comparison by using:
    • operators =, >, >=, <, <=, <>
    • method Object.Equals
  • LIKE operator by using methods:
    • String.Contains
    • String.EndsWith
  • STARTS WITH operator by using String.StartsWith method
  • IEnumerable.Contains method in LINQ queries
  • DbHelper.GetObjectNo method in LINQ queries
  • IS operator by using is operator in LINQ queries
  • OFFSET clause by using IQueryable.Skip method
  • FETCH clause by using methods:
    • IQueryable.Take
    • IQueryable.FirstOrDefault
    • IQueryable.First
    • IQueryable.Single
    • IQueryable.SingleOrDefault
  • COUNT function by using methods IQueryable.Count and IQueryable.LongCount
  • AVG function by using method IQueryable.Average
  • MIN function by using method IQueryable.Min
  • MAX function by using method IQueryable.Max
  • SUM function by using method IQueryable.Sum
  • Calculating expression values in LINQ queries
  • DELETE FROM statement by using methods:
    • Starcounter.Linq.Queriable.Delete
    • Starcounter.Linq.Queriable.DeleteAll
  • Using of generic types for a query context
  • Overridden IQueryable.ToString for providing of generated SQL queries

Unsupported features

  • IQueryable.All method - #31
  • Querying a specific set of data properties (currently supports only single property querying) - #60

For the latest news, look at the Starcounter Blog.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages