Skip to content

Commit

Permalink
Document SQL Server function mappings
Browse files Browse the repository at this point in the history
Part of dotnet#504
  • Loading branch information
bricelam committed Oct 12, 2020
1 parent 9c200e6 commit 307e0ce
Show file tree
Hide file tree
Showing 4 changed files with 231 additions and 25 deletions.
187 changes: 187 additions & 0 deletions entity-framework/core/providers/sql-server/functions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
---
title: Function Mappings - Microsoft SQL Server Database Provider - EF Core
description: Function Mappings of the Microsoft SQL Server database provider
author: bricelam
ms.date: 10/07/2020
uid: core/providers/sql-server/functions
---
# Function Mappings of the Microsoft SQL Server Provider

This page shows which .NET members are translated into which SQL functions when using the SQL Server provider.

## Binary functions

.NET | SQL | Added in
---------------------------- | ----------------------------- | --------
bytes.Contains(value) | CHARINDEX(@value, @bytes) > 0 | EF Core 5.0
bytes.Length | DATALENGTH(@bytes) | EF Core 5.0
bytes.SequenceEqual(second) | @bytes = @second | EF Core 5.0
EF.Functions.DataLength(arg) | DATALENGTH(@arg) | EF Core 5.0

## Conversion functions

.NET | SQL | Added in
------------------------- | -------------------------------------- | --------
bytes.ToString() | CONVERT(varchar(100), @bytes)
byteValue.ToString() | CONVERT(varchar(3), @byteValue)
charValue.ToString() | CONVERT(varchar(1), @charValue)
Convert.ToBoolean(value) | CONVERT(bit, @value) | EF Core 5.0
Convert.ToByte(value) | CONVERT(tinyint, @value)
Convert.ToDecimal(value) | CONVERT(decimal(18, 2), @value)
Convert.ToDouble(value) | CONVERT(float, @value)
Convert.ToInt16(value) | CONVERT(smallint, @value)
Convert.ToInt32(value) | CONVERT(int, @value)
Convert.ToInt64(value) | CONVERT(bigint, @value)
Convert.ToString(value) | CONVERT(nvarchar(max), @value)
dateTime.ToString() | CONVERT(varchar(100), @dateTime)
dateTimeOffset.ToString() | CONVERT(varchar(100), @dateTimeOffset)
decimalValue.ToString() | CONVERT(varchar(100), @decimalValue)
doubleValue.ToString() | CONVERT(varchar(100), @doubleValue)
floatValue.ToString() | CONVERT(varchar(100), @floatValue)
guid.ToString() | CONVERT(varchar(36), @guid)
intValue.ToString() | CONVERT(varchar(11), @intValue)
longValue.ToString() | CONVERT(varchar(20), @longValue)
sbyteValue.ToString() | CONVERT(varchar(4), @sbyteValue)
shortValue.ToString() | CONVERT(varchar(6), @shortValue)
timeSpan.ToString() | CONVERT(varchar(100), @timeSpan)
uintValue.ToString() | CONVERT(varchar(10), @uintValue)
ulongValue.ToString() | CONVERT(varchar(19), @ulongValue)
ushortValue.ToString() | CONVERT(varchar(5), @ushortValue)

## Date and time functions

.NET | SQL | Added in
----------------------------------------------------------- | ---------------------------------------------------- | --------
DateTime.Now | GETDATE()
DateTime.Today | CONVERT(date, GETDATE())
DateTime.UtcNow | GETUTCDATE()
dateTime.AddDays(value) | DATEADD(day, @value, @dateTime)
dateTime.AddHours(value) | DATEADD(hour, @value, @dateTime)
dateTime.AddMilliseconds(value) | DATEADD(millisecond, @value, @dateTime)
dateTime.AddMinutes(value) | DATEADD(minute, @value, @dateTime)
dateTime.AddMonths(months) | DATEADD(month, @months, @dateTime)
dateTime.AddSeconds(value) | DATEADD(second, @value, @dateTime)
dateTime.AddYears(value) | DATEADD(year, @value, @dateTime)
dateTime.Date | CONVERT(date, @dateTime)
dateTime.Day | DATEPART(day, @dateTime)
dateTime.DayOfYear | DATEPART(dayofyear, @dateTime)
dateTime.Hour | DATEPART(hour, @dateTime)
dateTime.Millisecond | DATEPART(millisecond, @dateTime)
dateTime.Minute | DATEPART(minute, @dateTime)
dateTime.Month | DATEPART(month, @dateTime)
dateTime.Second | DATEPART(second, @dateTime)
dateTime.TimeOfDay | CONVERT(time, @dateTime) | EF Core 2.2
dateTime.Year | DATEPART(year, @dateTime)
DateTimeOffset.Now | SYSDATETIMEOFFSET()
DateTimeOffset.UtcNow | SYSUTCDATETIME()
dateTimeOffset.AddDays(days) | DATEADD(day, @days, @dateTimeOffset)
dateTimeOffset.AddHours(hours) | DATEADD(hour, @hours, @dateTimeOffset)
dateTimeOffset.AddMilliseconds(milliseconds) | DATEADD(millisecond, @milliseconds, @dateTimeOffset)
dateTimeOffset.AddMinutes(minutes) | DATEADD(minute, @minutes, @dateTimeOffset)
dateTimeOffset.AddMonths(months) | DATEADD(month, @months, @dateTimeOffset)
dateTimeOffset.AddSeconds(seconds) | DATEADD(second, @seconds, @dateTimeOffset)
dateTimeOffset.AddYears(years) | DATEADD(year, @years, @dateTimeOffset)
dateTimeOffset.Date | CONVERT(date, @dateTimeOffset)
dateTimeOffset.Day | DATEPART(day, @dateTimeOffset)
dateTimeOffset.DayOfYear | DATEPART(dayofyear, @dateTimeOffset)
dateTimeOffset.Hour | DATEPART(hour, @dateTimeOffset)
dateTimeOffset.Millisecond | DATEPART(millisecond, @dateTimeOffset)
dateTimeOffset.Minute | DATEPART(minute, @dateTimeOffset)
dateTimeOffset.Month | DATEPART(month, @dateTimeOffset)
dateTimeOffset.Second | DATEPART(second, @dateTimeOffset)
dateTimeOffset.TimeOfDay | CONVERT(time, @dateTimeOffset) | EF Core 2.2
dateTimeOffset.Year | DATEPART(year, @dateTimeOffset)
EF.Functions.DateDiffDay(start, end) | DATEDIFF(day, @start, @end)
EF.Functions.DateDiffHour(start, end) | DATEDIFF(hour, @start, @end)
EF.Functions.DateDiffMicrosecond(start, end) | DATEDIFF(microsecond, @start, @end)
EF.Functions.DateDiffMillisecond(start, end) | DATEDIFF(millisecond, @start, @end)
EF.Functions.DateDiffMinute(start, end) | DATEDIFF(minute, @start, @d2)
EF.Functions.DateDiffMonth(start, end) | DATEDIFF(month, @start, @end)
EF.Functions.DateDiffNanosecond(start, end) | DATEDIFF(nanosecond, @start, @end)
EF.Functions.DateDiffSecond(start, end) | DATEDIFF(second, @start, @end)
EF.Functions.DateDiffWeek(start, end) | DATEDIFF(week, @start, @end) | EF Core 5.0
EF.Functions.DateDiffYear(start, end) | DATEDIFF(year, @start, @end)
EF.Functions.DateFromParts(year, month, day) | DATEFROMPARTS(@year, @month, @day) | EF Core 5.0
EF.Functions.DateTime2FromParts(year, month, day, ...) | DATETIME2FROMPARTS(@year, @month, @day, ...) | EF Core 5.0
EF.Functions.DateTimeFromParts(year, month, day, ...) | DATETIMEFROMPARTS(@year, @month, @day, ...) | EF Core 5.0
EF.Functions.DateTimeOffsetFromParts(year, month, day, ...) | DATETIMEOFFSETFROMPARTS(@year, @month, @day, ...) | EF Core 5.0
EF.Functions.IsDate(expression) | ISDATE(@expression) | EF Core 3.0
EF.Functions.SmallDateTimeFromParts(year, month, day, ...) | SMALLDATETIMEFROMPARTS(@year, @month, @day, ...) | EF Core 5.0
EF.Functions.TimeFromParts(hour, minute, second, ...) | TIMEFROMPARTS(@hour, @minute, @second, ...) | EF Core 5.0
timeSpan.Hours | DATEPART(hour, @timeSpan) | EF Core 5.0
timeSpan.Milliseconds | DATEPART(millisecond, @timeSpan) | EF Core 5.0
timeSpan.Minutes | DATEPART(minute, @timeSpan) | EF Core 5.0
timeSpan.Seconds | DATEPART(second, @timeSpan) | EF Core 5.0

## Numeric functions

.NET | SQL
----------------------- | ---
Math.Abs(value) | ABS(@value)
Math.Acos(d) | ACOS(@d)
Math.Asin(d) | ASIN(@d)
Math.Atan(d) | ATAN(@d)
Math.Atan2(y, x) | ATN2(@y, @x)
Math.Ceiling(d) | CEILING(@d)
Math.Cos(d) | COS(@d)
Math.Exp(d) | EXP(@d)
Math.Floor(d) | FLOOR(@d)
Math.Log(d) | LOG(@d)
Math.Log(a, newBase) | LOG(@a, @newBase)
Math.Log10(d) | LOG10(@d)
Math.Pow(x, y) | POWER(@x, @y)
Math.Round(d) | ROUND(@d, 0)
Math.Round(d, decimals) | ROUND(@d, @decimals)
Math.Sign(value) | SIGN(@value)
Math.Sin(a) | SIN(@a)
Math.Sqrt(d) | SQRT(@d)
Math.Tan(a) | TAN(@a)
Math.Truncate(d) | ROUND(@d, 0, 1)

## String functions

.NET | SQL | Added in
----------------------------------------------------------------------- | ---------------------------------------------------------------------- | --------
EF.Functions.Collate(operand, collation) | @operand COLLATE @collation | EF Core 5.0
EF.Functions.Contains(propertyReference, searchCondition) | CONTAINS(@propertyReference, @searchCondition) | EF Core 2.2
EF.Functions.Contains(propertyReference, searchCondition, languageTerm) | CONTAINS(@propertyReference, @searchCondition, LANGUAGE @languageTerm) | EF Core 2.2
EF.Functions.FreeText(propertyReference, freeText) | FREETEXT(@propertyReference, @freeText)
EF.Functions.FreeText(propertyReference, freeText, languageTerm) | FREETEXT(@propertyReference, @freeText, LANGUAGE @languageTerm)
EF.Functions.Like(matchExpression, pattern) | @matchExpression LIKE @pattern
EF.Functions.Like(matchExpression, pattern, escapeCharacter) | @matchExpression LIKE @pattern ESCAPE @escapeCharacter
string.Compare(strA, strB) | CASE WHEN @strA = @strB THEN 0 ... END
string.Concat(str0, str1) | @str0 + @str1
string.IsNullOrEmpty(value) | @value IS NULL OR @value = N''
string.IsNullOrWhiteSpace(value) | @value IS NULL OR LTRIM(RTRIM(@value)) = N''
stringValue.CompareTo(strB) | CASE WHEN @stringValue = @strB THEN 0 ... END
stringValue.Contains(value) | @stringValue LIKE N'%' + @value + N'%'
stringValue.EndsWith(value) | @stringValue LIKE N'%' + @value
stringValue.FirstOrDefault() | SUBSTRING(@stringValue, 1, 1) | EF Core 5.0
stringValue.IndexOf(value) | CHARINDEX(@value, @stringValue) - 1
stringValue.LastOrDefault() | SUBSTRING(@stringValue, LEN(@stringValue), 1) | EF Core 5.0
stringValue.Length | LEN(@stringValue)
stringValue.Replace(@oldValue, @newValue) | REPLACE(@stringValue, @oldValue, @newValue)
stringValue.StartsWith(value) | @stringValue LIKE @value + N'%'
stringValue.Substring(startIndex, length) | SUBSTRING(@stringValue, @startIndex + 1, @length)
stringValue.ToLower() | LOWER(@stringValue)
stringValue.ToUpper() | UPPER(@stringValue)
stringValue.Trim() | LTRIM(RTRIM(@stringValue))
stringValue.TrimEnd() | RTRIM(@stringValue)
stringValue.TrimStart() | LTRIM(@stringValue)

## Miscellaneous functions

.NET | SQL | Added in
---------------------------------------- | ---------------------------------- | --------
collection.Contains(item) | @item IN @collection | EF Core 3.0
enumValue.HasFlag(flag) | @enumValue & @flag = @flag
Guid.NewGuid() | NEWID()
nullable.GetValueOrDefault() | COALESCE(@nullable, 0)
nullable.GetValueOrDefault(defaultValue) | COALESCE(@nullable, @defaultValue)

> [!NOTE]
> Some SQL has been simplified for illustration purposes. The actual SQL is more complex to handle a wider range of values.
## See also

* [Spatial Function Mappings](xref:core/providers/sql-server/spatial#spatial-function-mappings)
2 changes: 1 addition & 1 deletion entity-framework/core/providers/sql-server/spatial.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ As mentioned in the main [Spatial Data](xref:core/modeling/spatial) documentatio
> [!WARNING]
> CircularString, CompoundCurve, and CurePolygon aren't supported by NTS.
## Translated Operations
## Spatial function mappings

This table shows which NTS members are translated into which SQL functions. Note that the translations vary depending on whether the column is of type geography or geometry.

Expand Down
Loading

0 comments on commit 307e0ce

Please sign in to comment.