Mercurial > pub > bltoolkit
diff Source/Data/Linq/Extensions.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Data/Linq/Extensions.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,369 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Reflection; +using System.Text.RegularExpressions; + +using JetBrains.Annotations; + +namespace BLToolkit.Data.Linq +{ + using DataAccess; + + public static class Extensions + { + #region Table Helpers + + static public Table<T> GetTable<T>(this IDataContext dataContext) + where T : class + { + return new Table<T>(dataContext); + } + + static public Table<T> GetTable<T>( + this IDataContext dataContext, + object instance, + [NotNull] MethodInfo methodInfo, + [NotNull] params object[] parameters) + where T : class + { + if (methodInfo == null) throw new ArgumentNullException("methodInfo"); + if (parameters == null) throw new ArgumentNullException("parameters"); + + if (!typeof(Table<T>).IsAssignableFrom(methodInfo.ReturnType)) + throw new LinqException( + "Method '{0}.{1}' must return type 'Table<{2}>'", + methodInfo.Name, methodInfo.DeclaringType.FullName, typeof(T).FullName); + + Expression expr; + + if (parameters.Length > 0) + { + var pis = methodInfo.GetParameters(); + var args = new List<Expression>(parameters.Length); + + for (var i = 0; i < parameters.Length; i++) + { + var type = pis[i].ParameterType; + args.Add(Expression.Constant(parameters[i], type.IsByRef ? type.GetElementType() : type)); + } + + expr = Expression.Call(Expression.Constant(instance), methodInfo, args); + } + else + expr = Expression.Call(Expression.Constant(instance), methodInfo); + + return new Table<T>(dataContext, expr); + } + + #endregion + + #region Compile + + /// <summary> + /// Compiles the query. + /// </summary> + /// <returns> + /// A generic delegate that represents the compiled query. + /// </returns> + /// <param name="dataContext"></param> + /// <param name="query"> + /// The query expression to be compiled. + /// </param> + /// <typeparam name="TDc"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TResult"> + /// Returned type of the delegate returned by the method. + /// </typeparam> + static public Func<TDc,TResult> Compile<TDc,TResult>( + [NotNull] this IDataContext dataContext, + [NotNull] Expression<Func<TDc,TResult>> query) + where TDc : IDataContext + { + return CompiledQuery.Compile(query); + } + + /// <summary> + /// Compiles the query. + /// </summary> + /// <returns> + /// A generic delegate that represents the compiled query. + /// </returns> + /// <param name="dataContext"></param> + /// <param name="query"> + /// The query expression to be compiled. + /// </param> + /// <typeparam name="TDc"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TArg1"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TResult"> + /// Returned type of the delegate returned by the method. + /// </typeparam> + static public Func<TDc,TArg1,TResult> Compile<TDc,TArg1, TResult>( + [NotNull] this IDataContext dataContext, + [NotNull] Expression<Func<TDc,TArg1,TResult>> query) + where TDc : IDataContext + { + return CompiledQuery.Compile(query); + } + + /// <summary> + /// Compiles the query. + /// </summary> + /// <returns> + /// A generic delegate that represents the compiled query. + /// </returns> + /// <param name="dataContext"></param> + /// <param name="query"> + /// The query expression to be compiled. + /// </param> + /// <typeparam name="TDc"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TArg1"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TArg2"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TResult"> + /// Returned type of the delegate returned by the method. + /// </typeparam> + static public Func<TDc,TArg1,TArg2,TResult> Compile<TDc,TArg1,TArg2,TResult>( + [NotNull] this IDataContext dataContext, + [NotNull] Expression<Func<TDc,TArg1,TArg2,TResult>> query) + where TDc : IDataContext + { + return CompiledQuery.Compile(query); + } + + /// <summary> + /// Compiles the query. + /// </summary> + /// <returns> + /// A generic delegate that represents the compiled query. + /// </returns> + /// <param name="dataContext"></param> + /// <param name="query"> + /// The query expression to be compiled. + /// </param> + /// <typeparam name="TDc"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TArg1"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TArg2"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TArg3"> + /// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method. + /// </typeparam> + /// <typeparam name="TResult"> + /// Returned type of the delegate returned by the method. + /// </typeparam> + static public Func<TDc,TArg1,TArg2,TArg3,TResult> Compile<TDc,TArg1,TArg2,TArg3,TResult>( + [NotNull] this IDataContext dataContext, + [NotNull] Expression<Func<TDc,TArg1,TArg2,TArg3,TResult>> query) + where TDc : IDataContext + { + return CompiledQuery.Compile(query); + } + + #endregion + + #region Object Operations + + #region Insert + + public static int Insert<T>([NotNull] this IDataContextInfo dataContextInfo, T obj) + { + if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo"); + return Query<T>.Insert(dataContextInfo, obj); + } + + public static int Insert<T>(this IDataContext dataContext, T obj) + { + return Query<T>.Insert(DataContextInfo.Create(dataContext), obj); + } + + #endregion + + #region InsertOrUpdate + + [Obsolete("Use 'InsertOrReplace' instead.")] + public static int InsertOrUpdate<T>(this IDataContextInfo dataContextInfo, T obj) + { + return InsertOrReplace(dataContextInfo, obj); + } + + public static int InsertOrReplace<T>([NotNull] this IDataContextInfo dataContextInfo, T obj) + { + if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo"); + return Query<T>.InsertOrReplace(dataContextInfo, obj); + } + + public static int InsertOrReplace<T>([NotNull] this IDataContextInfo dataContextInfo, IEnumerable<T> objs) + { + if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo"); + int cnt = 0; + foreach (var obj in objs) + { + cnt += Query<T>.InsertOrReplace(dataContextInfo, obj); + } + return cnt; + } + + [Obsolete("Use 'InsertOrReplace' instead.")] + public static int InsertOrUpdate<T>(this IDataContext dataContext, T obj) + { + return InsertOrReplace(dataContext, obj); + } + + public static int InsertOrReplace<T>(this IDataContext dataContext, T obj) + { + return Query<T>.InsertOrReplace(DataContextInfo.Create(dataContext), obj); + } + + public static int InsertOrReplace<T>(this IDataContext dataContext, IEnumerable<T> objs) + { + int cnt = 0; + foreach (var obj in objs) + { + cnt += Query<T>.InsertOrReplace(DataContextInfo.Create(dataContext), obj); + } + return cnt; + } + + #endregion + + #region InsertBatch + +#if !SILVERLIGHT + + public static int InsertBatch<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list) + { + return new SqlQuery<T>(dataContext).Insert(dataContext, maxBatchSize, list); + } + + public static int InsertBatch<T>(this DbManager dataContext, IEnumerable<T> list) + { + return InsertBatch(dataContext, int.MaxValue, list); + } + + public static int InsertBatch<T>(this DbManager dataContext, T[] list) + { + return InsertBatch(dataContext, int.MaxValue, list); + } + + [Obsolete("Use InsertBatch instead.")] + public static int Insert<T>(this DbManager dataContext, T[] list) + { + return Insert(dataContext, int.MaxValue, list); + } + + [Obsolete("Use InsertBatch instead.")] + public static int Insert<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list) + { + return new SqlQuery<T>().Insert(dataContext, maxBatchSize, list); + } + + [Obsolete("Use InsertBatch instead.")] + public static int Insert<T>(this DbManager dataContext, IEnumerable<T> list) + { + return Insert(dataContext, int.MaxValue, list); + } + +#endif + + #endregion + + #region InsertWithIdentity + + public static object InsertWithIdentity<T>([NotNull] this IDataContextInfo dataContextInfo, T obj) + { + if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo"); + return Query<T>.InsertWithIdentity(dataContextInfo, obj); + } + + public static object InsertWithIdentity<T>(this IDataContext dataContext, T obj) + { + return Query<T>.InsertWithIdentity(DataContextInfo.Create(dataContext), obj); + } + + #endregion + + #region Update + + public static int Update<T>([NotNull] this IDataContextInfo dataContextInfo, T obj) + { + if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo"); + return Query<T>.Update(dataContextInfo, obj); + } + + public static int Update<T>(this IDataContext dataContext, T obj) + { + return Query<T>.Update(DataContextInfo.Create(dataContext), obj); + } + +#if !SILVERLIGHT + + public static int Update<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list) + { + return new SqlQuery<T>(dataContext).Update(dataContext, maxBatchSize, list); + } + + public static int Update<T>(this DbManager dataContext, IEnumerable<T> list) + { + return Update(dataContext, int.MaxValue, list); + } + +#endif + + #endregion + + #region Delete + + public static int Delete<T>([NotNull] this IDataContextInfo dataContextInfo, T obj) + { + if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo"); + return Query<T>.Delete(dataContextInfo, obj); + } + + public static int Delete<T>([NotNull] this IDataContext dataContext, T obj) + { + return Query<T>.Delete(DataContextInfo.Create(dataContext), obj); + } + +#if !SILVERLIGHT + + public static int Delete<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list) + { + return new SqlQuery<T>(dataContext).Delete(dataContext, maxBatchSize, list); + } + + public static int Delete<T>(this DbManager dataContext, IEnumerable<T> list) + { + return Delete(dataContext, int.MaxValue, list); + } + +#endif + + #endregion + + #endregion + + #region String Extensions + + public static int ContainsExactly(this string s, string value) + { + return Regex.Matches(s, string.Format(@"(^|\s){0}(\s|$)", value), RegexOptions.IgnoreCase).Count; + } + + #endregion + } +}