| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Reflection;
- using System.Diagnostics.CodeAnalysis;
- namespace System.Data.Linq.SqlClient {
- public static class SqlMethods {
- /// <summary>
- /// Counts the number of year boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(YEAR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of year boundaries crossed between the dates.</returns>
- public static int DateDiffYear(DateTime startDate, DateTime endDate) {
- return endDate.Year - startDate.Year;
- }
- /// <summary>
- /// Counts the number of year boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(YEAR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of year boundaries crossed between the dates.</returns>
- public static int? DateDiffYear(DateTime? startDate, DateTime? endDate) {
- if (startDate.HasValue && endDate.HasValue) {
- return DateDiffYear(startDate.Value,endDate.Value);
- } else {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of year boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(YEAR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of year boundaries crossed between the dates.</returns>
- public static int DateDiffYear(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffYear(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of year boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(YEAR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of year boundaries crossed between the dates.</returns>
- public static int? DateDiffYear(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffYear(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of month boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MONTH,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of month boundaries crossed between the dates.</returns>
- public static int DateDiffMonth(DateTime startDate, DateTime endDate) {
- return 12 * (endDate.Year - startDate.Year) + endDate.Month - startDate.Month;
- }
- /// <summary>
- /// Counts the number of month boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MONTH,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of month boundaries crossed between the dates.</returns>
- public static int? DateDiffMonth(DateTime? startDate, DateTime? endDate) {
- if (startDate.HasValue && endDate.HasValue) {
- return DateDiffMonth(startDate.Value, endDate.Value);
- } else {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of month boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MONTH,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of month boundaries crossed between the dates.</returns>
- public static int DateDiffMonth(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffMonth(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of month boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MONTH,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of month boundaries crossed between the dates.</returns>
-
- public static int? DateDiffMonth(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffMonth(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of day boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(DAY,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of day boundaries crossed between the dates.</returns>
- public static int DateDiffDay(DateTime startDate, DateTime endDate) {
- TimeSpan diff = endDate.Date - startDate.Date;
- return diff.Days;
- }
- /// <summary>
- /// Counts the number of day boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(DAY,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of day boundaries crossed between the dates.</returns>
- public static int? DateDiffDay(DateTime? startDate, DateTime? endDate) {
- if (startDate.HasValue && endDate.HasValue) {
- return DateDiffDay(startDate.Value, endDate.Value);
- } else {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of day boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(DAY,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of day boundaries crossed between the dates.</returns>
- public static int DateDiffDay(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffDay(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of day boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(DAY,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of day boundaries crossed between the dates.</returns>
- public static int? DateDiffDay(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffDay(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of hour boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(HOUR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of hour boundaries crossed between the dates.</returns>
- public static int DateDiffHour(DateTime startDate, DateTime endDate) {
- checked {
- return DateDiffDay(startDate, endDate) * 24 + endDate.Hour - startDate.Hour;
- }
- }
- /// <summary>
- /// Counts the number of hour boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(HOUR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of hour boundaries crossed between the dates.</returns>
- public static int? DateDiffHour(DateTime? startDate, DateTime? endDate) {
- if (startDate.HasValue && endDate.HasValue) {
- return DateDiffHour(startDate.Value, endDate.Value);
- } else {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of hour boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(HOUR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of hour boundaries crossed between the dates.</returns>
- public static int DateDiffHour(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffHour(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of hour boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(HOUR,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of hour boundaries crossed between the dates.</returns>
- public static int? DateDiffHour(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffHour(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of minute boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MINUTE,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of minute boundaries crossed between the dates.</returns>
- public static int DateDiffMinute(DateTime startDate, DateTime endDate) {
- checked {
- return DateDiffHour(startDate, endDate) * 60 + endDate.Minute - startDate.Minute;
- }
- }
- /// <summary>
- /// Counts the number of minute boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MINUTE,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of minute boundaries crossed between the dates.</returns>
- public static int? DateDiffMinute(DateTime? startDate, DateTime? endDate) {
- if (startDate.HasValue && endDate.HasValue) {
- return DateDiffMinute(startDate.Value, endDate.Value);
- } else {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of minute boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MINUTE,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of minute boundaries crossed between the dates.</returns>
- public static int DateDiffMinute(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffMinute(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of minute boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MINUTE,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of minute boundaries crossed between the dates.</returns>
-
- public static int? DateDiffMinute(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffMinute(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of second boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(SECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of second boundaries crossed between the dates.</returns>
- public static int DateDiffSecond(DateTime startDate, DateTime endDate) {
- checked {
- return DateDiffMinute(startDate, endDate) * 60 + endDate.Second - startDate.Second;
- }
- }
- /// <summary>
- /// Counts the number of second boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(SECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of second boundaries crossed between the dates.</returns>
- public static int? DateDiffSecond(DateTime? startDate, DateTime? endDate) {
- if (startDate.HasValue && endDate.HasValue) {
- return DateDiffSecond(startDate.Value, endDate.Value);
- } else {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of second boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(SECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of second boundaries crossed between the dates.</returns>
- public static int DateDiffSecond(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffSecond(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of second boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(SECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of second boundaries crossed between the dates.</returns>
-
- public static int? DateDiffSecond(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffSecond(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of millisecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MILLISECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of millisecond boundaries crossed between the dates.</returns>
- public static int DateDiffMillisecond(DateTime startDate, DateTime endDate) {
- checked {
- return DateDiffSecond(startDate, endDate) * 1000 + endDate.Millisecond - startDate.Millisecond;
- }
- }
- /// <summary>
- /// Counts the number of millisecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MILLISECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of millisecond boundaries crossed between the dates.</returns>
- public static int? DateDiffMillisecond(DateTime? startDate, DateTime? endDate) {
- if (startDate.HasValue && endDate.HasValue) {
- return DateDiffMillisecond(startDate.Value, endDate.Value);
- } else {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of millisecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MILLISECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of millisecond boundaries crossed between the dates.</returns>
- public static int DateDiffMillisecond(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffMillisecond(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of millisecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MILLISECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of millisecond boundaries crossed between the dates.</returns>
-
- public static int? DateDiffMillisecond(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffMillisecond(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of microsecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MICROSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of microsecond boundaries crossed between the dates.</returns>
- public static int DateDiffMicrosecond(DateTime startDate, DateTime endDate)
- {
- checked
- {
- return (int)((endDate.Ticks - startDate.Ticks) / 10);
- }
- }
- /// <summary>
- /// Counts the number of microsecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MICROSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of microsecond boundaries crossed between the dates.</returns>
- public static int? DateDiffMicrosecond(DateTime? startDate, DateTime? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffMicrosecond(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of microsecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MICROSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of microsecond boundaries crossed between the dates.</returns>
- public static int DateDiffMicrosecond(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffMicrosecond(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of microsecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(MICROSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of microsecond boundaries crossed between the dates.</returns>
-
- public static int? DateDiffMicrosecond(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffMicrosecond(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of nanosecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(NANOSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of nanosecond boundaries crossed between the dates.</returns>
- public static int DateDiffNanosecond(DateTime startDate, DateTime endDate)
- {
- checked
- {
- return (int)((endDate.Ticks - startDate.Ticks) * 100);
- }
- }
- /// <summary>
- /// Counts the number of nanosecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(NANOSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of nanosecond boundaries crossed between the dates.</returns>
- public static int? DateDiffNanosecond(DateTime? startDate, DateTime? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffNanosecond(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// Counts the number of nanosecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(NANOSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of nanosecond boundaries crossed between the dates.</returns>
- public static int DateDiffNanosecond(DateTimeOffset startDate, DateTimeOffset endDate)
- {
- return DateDiffNanosecond(startDate.UtcDateTime, endDate.UtcDateTime);
- }
- /// <summary>
- /// Counts the number of nanosecond boundaries crossed between the startDate and endDate.
- /// Corresponds to SQL Server's DATEDIFF(NANOSECOND,startDate,endDate).
- /// </summary>
- /// <param name="startDate">Starting date for the calculation.</param>
- /// <param name="endDate">Ending date for the calculation.</param>
- /// <returns>Number of nanosecond boundaries crossed between the dates.</returns>
- public static int? DateDiffNanosecond(DateTimeOffset? startDate, DateTimeOffset? endDate)
- {
- if (startDate.HasValue && endDate.HasValue)
- {
- return DateDiffNanosecond(startDate.Value, endDate.Value);
- }
- else
- {
- return null;
- }
- }
- /// <summary>
- /// This function is translated to Sql Server's LIKE function.
- /// It cannot be used on the client.
- /// </summary>
- /// <param name="match_expression">The string that is to be matched.</param>
- /// <param name="pattern">The pattern which may involve wildcards %,_,[,],^.</param>
- /// <returns>true if there is a match.</returns>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "pattern", Justification = "[....]: Method is a placeholder for a server-side method.")]
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "matchExpression", Justification = "[....]: Method is a placeholder for a server-side method.")]
- public static bool Like(string matchExpression, string pattern) {
- throw Error.SqlMethodOnlyForSql(MethodInfo.GetCurrentMethod());
- }
- /// <summary>
- /// This function is translated to Sql Server's LIKE function.
- /// It cannot be used on the client.
- /// </summary>
- /// <param name="match_expression">The string that is to be matched.</param>
- /// <param name="pattern">The pattern which may involve wildcards %,_,[,],^.</param>
- /// <param name="escape_character">The escape character to use in front of %,_,[,],^ if they are not used as wildcards.</param>
- /// <returns>true if there is a match.</returns>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "pattern", Justification = "[....]: Method is a placeholder for a server-side method.")]
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "matchExpression", Justification = "[....]: Method is a placeholder for a server-side method.")]
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "escapeCharacter", Justification = "[....]: Method is a placeholder for a server-side method.")]
- public static bool Like(string matchExpression, string pattern, char escapeCharacter) {
- throw Error.SqlMethodOnlyForSql(MethodInfo.GetCurrentMethod());
- }
- /// <summary>
- /// This function is translated to Sql Server's DATALENGTH function. It differs
- /// from LEN in that it includes trailing spaces and will count UNICODE characters
- /// per byte.
- /// It cannot be used on the client.
- /// </summary>
- /// <param name="value">The string to take the length of.</param>
- /// <returns>length of the string</returns>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value", Justification = "[....]: Method is a placeholder for a server-side method.")]
- internal static int RawLength(string value) {
- throw Error.SqlMethodOnlyForSql(MethodInfo.GetCurrentMethod());
- }
- /// <summary>
- /// This function is translated to Sql Server's DATALENGTH function.
- /// It cannot be used on the client.
- /// </summary>
- /// <param name="value">The byte array to take the length of.</param>
- /// <returns>length of the array</returns>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value", Justification = "[....]: Method is a placeholder for a server-side method.")]
- internal static int RawLength(byte[] value) {
- throw Error.SqlMethodOnlyForSql(MethodInfo.GetCurrentMethod());
- }
- /// <summary>
- /// This function is translated to Sql Server's DATALENGTH function.
- /// It cannot be used on the client.
- /// </summary>
- /// <param name="value">The Binary value to take the length of.</param>
- /// <returns>length of the Binary</returns>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value", Justification = "[....]: Method is a placeholder for a server-side method.")]
- internal static int RawLength(Binary value) {
- throw Error.SqlMethodOnlyForSql(MethodInfo.GetCurrentMethod());
- }
- }
- public static class SqlHelpers {
- public static string GetStringContainsPattern(string text, char escape) {
- bool usedEscapeChar = false;
- return GetStringContainsPattern(text, escape, out usedEscapeChar);
- }
- internal static string GetStringContainsPattern(string text, char escape, out bool usedEscapeChar) {
- if (text == null) {
- throw Error.ArgumentNull("text");
- }
- return "%" + EscapeLikeText(text, escape, false, out usedEscapeChar) + "%";
- }
- internal static string GetStringContainsPatternForced(string text, char escape) {
- if (text == null) {
- throw Error.ArgumentNull("text");
- }
- bool usedEscapeChar = false;
- return "%" + EscapeLikeText(text, escape, true, out usedEscapeChar) + "%";
- }
- public static string GetStringStartsWithPattern(string text, char escape) {
- bool usedEscapeChar = false;
- return GetStringStartsWithPattern(text, escape, out usedEscapeChar);
- }
- internal static string GetStringStartsWithPattern(string text, char escape, out bool usedEscapeChar) {
- if (text == null) {
- throw Error.ArgumentNull("text");
- }
- return EscapeLikeText(text, escape, false, out usedEscapeChar) + "%";
- }
- internal static string GetStringStartsWithPatternForced(string text, char escape) {
- if (text == null) {
- throw Error.ArgumentNull("text");
- }
- bool usedEscapeChar = false;
- return EscapeLikeText(text, escape, true, out usedEscapeChar) + "%";
- }
- public static string GetStringEndsWithPattern(string text, char escape) {
- bool usedEscapeChar = false;
- return GetStringEndsWithPattern(text, escape, out usedEscapeChar);
- }
- internal static string GetStringEndsWithPattern(string text, char escape, out bool usedEscapeChar) {
- if (text == null) {
- throw Error.ArgumentNull("text");
- }
- return "%" + EscapeLikeText(text, escape, false, out usedEscapeChar);
- }
- internal static string GetStringEndsWithPatternForced(string text, char escape) {
- if (text == null) {
- throw Error.ArgumentNull("text");
- }
- bool usedEscapeChar = false;
- return "%" + EscapeLikeText(text, escape, true, out usedEscapeChar);
- }
- private static string EscapeLikeText(string text, char escape, bool forceEscaping, out bool usedEscapeChar) {
- usedEscapeChar = false;
- if (!(forceEscaping || text.Contains("%") || text.Contains("_") || text.Contains("[") || text.Contains("^"))) {
- return text;
- }
- StringBuilder sb = new StringBuilder(text.Length);
- foreach (char c in text) {
- if (c == '%' || c == '_' || c == '[' || c == '^' || c == escape) {
- sb.Append(escape);
- usedEscapeChar = true;
- }
- sb.Append(c);
- }
- return sb.ToString();
- }
- public static string TranslateVBLikePattern(string pattern, char escape) {
- if (pattern == null) {
- throw Error.ArgumentNull("pattern");
- }
- const char vbMany = '*';
- const char sqlMany = '%';
- const char vbSingle = '?';
- const char sqlSingle = '_';
- const char vbDigit = '#';
- const string sqlDigit = "[0-9]";
- const char vbOpenBracket = '[';
- const char sqlOpenBracket = '[';
- const char vbCloseBracket = ']';
- const char sqlCloseBracket = ']';
- const char vbNotList = '!';
- const char sqlNotList = '^';
- const char vbCharRange = '-';
- const char sqlCharRange = '-';
- // walk the string, performing conversions
- StringBuilder result = new StringBuilder();
- bool bracketed = false;
- bool charRange = false;
- bool possibleNotList = false;
- int numBracketedCharacters = 0;
- foreach (char patternChar in pattern) {
- if (bracketed) {
- numBracketedCharacters++;
- // if we're in a possible NotList, anything other than a close bracket will confirm it
- if (possibleNotList) {
- if (patternChar != vbCloseBracket) {
- result.Append(sqlNotList);
- possibleNotList = false;
- }
- else {
- result.Append(vbNotList);
- possibleNotList = false;
- }
- }
- switch (patternChar) {
- case vbNotList: {
- // translate to SQL's NotList only if the first character in the group
- if (numBracketedCharacters == 1) {
- // latch this, and detect the next cycle
- possibleNotList = true;
- }
- else {
- result.Append(patternChar);
- }
- break;
- }
- case vbCloseBracket: {
- // close down the bracket group
- bracketed = false;
- possibleNotList = false;
- result.Append(sqlCloseBracket);
- break;
- }
- case vbCharRange: {
- if (charRange) {
- // we've seen the char range indicator already -- SQL
- // doesn't support multiple ranges in the same group
- throw Error.VbLikeDoesNotSupportMultipleCharacterRanges();
- }
- else {
- // remember that we've seen this in the group
- charRange = true;
- result.Append(sqlCharRange);
- break;
- }
- }
- case sqlNotList: {
- if (numBracketedCharacters == 1) {
- // need to escape this one
- result.Append(escape);
- }
- result.Append(patternChar);
- break;
- }
- default: {
- if (patternChar == escape) {
- result.Append(escape);
- result.Append(escape);
- }
- else {
- result.Append(patternChar);
- }
- break;
- }
- }
- }
- else {
- switch (patternChar) {
- case vbMany: {
- result.Append(sqlMany);
- break;
- }
- case vbSingle: {
- result.Append(sqlSingle);
- break;
- }
- case vbDigit: {
- result.Append(sqlDigit);
- break;
- }
- case vbOpenBracket: {
- // we're openning a bracketed group, so reset the group state
- bracketed = true;
- charRange = false;
- numBracketedCharacters = 0;
- result.Append(sqlOpenBracket);
- break;
- }
- // SQL's special characters need to be escaped
- case sqlMany:
- case sqlSingle: {
- result.Append(escape);
- result.Append(patternChar);
- break;
- }
- default: {
- if (patternChar == escape) {
- result.Append(escape);
- result.Append(escape);
- }
- else {
- result.Append(patternChar);
- }
- break;
- }
- }
- }
- }
- if (bracketed) {
- throw Error.VbLikeUnclosedBracket();
- }
- return result.ToString();
- }
- }
- }
|