1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.Common;
- using System.Data.Entity;
- using System.Data.Entity.Infrastructure;
- using System.Transactions;
- using System.Data.SqlClient;
- using System.Linq.Expressions;
- using System.Data;
- using Bowin.Common.Linq.DB;
- using System.Configuration;
- using System.Reflection;
- using System.Data.Entity.Core.Objects;
- using System.Data.Entity.Core.Objects.DataClasses;
- using System.Data.Linq.Mapping;
- using System.Data.Entity.Core;
- using EntityFramework.Extensions;
- using AutoMapper;
- using System.Dynamic;
- namespace Bowin.Common.Linq.Entity
- {
- public static class EFModelExt
- {
- // public static void Delete<TEntity, TKeys>(this DbSet<TEntity> dbSet, IEnumerable<TKeys> keyList) where TEntity : class
- // {
- // var keyType = typeof(TKeys);
- // string tableName = typeof(TEntity).Name;
- // IList<TEntity> result = new List<TEntity>();
- // if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- // {
- // throw (new EntityException("keyList参数必须是复杂类型的列表。"));
- // }
- // string tmpTableName = "##DeleteTemp" + Guid.NewGuid().ToString().Replace("-", "");
- // SqlConnection conn;
- // if (SqlConnectionManager.IsGlobalConnectionStarted)
- // {
- // conn = SqlConnectionManager.GetConnection(dbSet.AsQueryable().GetConnectionKey());
- // }
- // else
- // {
- // //conn = new SqlConnection(dbSet.AsQueryable().GetConnection().ConnectionString);
- // conn = (SqlConnection)dbSet.AsQueryable().GetConnection();
- // }
- // conn.BulkCopyToTempTable(tmpTableName, keyList);
- // string sql = @"
- //delete t
- //from " + tableName + @" t
- //inner join " + tmpTableName + @" tmp on ";
- // var keyExpression = "";
- // foreach (var property in keyType.GetProperties())
- // {
- // if (property.PropertyType.IsValueType || property.PropertyType.Name.StartsWith("String"))
- // {
- // var field = property.Name;
- // if (keyExpression != "")
- // {
- // keyExpression += " and ";
- // }
- // keyExpression += "t.[" + field + "]" + "=tmp.[" + field + "]";
- // }
- // }
- // sql += keyExpression;
- // var command = new SqlCommand(sql, conn);
- // command.CommandTimeout = 12000;
- // command.CommandType = CommandType.Text;
- // command.ExecuteNonQuery();
- // command.CommandText = "drop table " + tmpTableName;
- // command.CommandType = System.Data.CommandType.Text;
- // command.ExecuteNonQuery();
- // if (!SqlConnectionManager.IsGlobalConnectionStarted)
- // {
- // conn.Close();
- // }
- // }
- // public static void Delete<TEntity, TKeys, TMatchKey>(this DbSet<TEntity> dbSet, IEnumerable<TKeys> keyList, Expression<Func<TEntity, TMatchKey>> singleKey) where TEntity : class
- // {
- // var keyType = typeof(TKeys);
- // string tableName = typeof(TEntity).Name;
- // var singleColumnName = "";
- // IList<TEntity> result = new List<TEntity>();
- // #region 检查参数输入
- // if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- // {
- // singleColumnName = "TmpColumn";
- // }
- // else
- // {
- // throw (new EntityException("keyList参数必须是基础类型的列表。"));
- // }
- // if (singleKey.Body.NodeType != ExpressionType.MemberAccess)
- // {
- // throw (new EntityException("singleKey参数必须是MemberAccess类型的Expression"));
- // }
- // #endregion
- // string tmpTableName = "##DeleteTemp" + Guid.NewGuid().ToString().Replace("-", "");
- // SqlConnection conn;
- // if (SqlConnectionManager.IsGlobalConnectionStarted)
- // {
- // conn = SqlConnectionManager.GetConnection(dbSet.AsQueryable().GetConnectionKey());
- // }
- // else
- // {
- // //conn = new SqlConnection(dbSet.AsQueryable().GetConnection().ConnectionString);
- // conn = (SqlConnection)dbSet.AsQueryable().GetConnection();
- // }
- // conn.BulkCopyToTempTable(tmpTableName, keyList, singleColumnName);
- // string sql = @"
- //delete t
- //from " + tableName + @" t
- //inner join " + tmpTableName + @" tmp on ";
- // if (singleColumnName != "")
- // {
- // sql += "t.[" + ((MemberExpression)singleKey.Body).Member.Name + "]=tmp.TmpColumn";
- // }
- // var command = new SqlCommand(sql, conn);
- // command.CommandTimeout = 12000;
- // command.CommandType = CommandType.Text;
- // command.ExecuteNonQuery();
- // command.CommandText = "drop table " + tmpTableName;
- // command.CommandType = System.Data.CommandType.Text;
- // command.ExecuteNonQuery();
- // if (!SqlConnectionManager.IsGlobalConnectionStarted)
- // {
- // conn.Close();
- // }
- // }
- // public static void Delete<TEntity, TKeys, TMatchKey>(this DbSet<TEntity> dbSet, SqlConnection db, IEnumerable<TKeys> keyList, Expression<Func<TEntity, TMatchKey>> singleKey) where TEntity : class
- // {
- // var keyType = typeof(TKeys);
- // string tableName = typeof(TEntity).Name;
- // var singleColumnName = "";
- // IList<TEntity> result = new List<TEntity>();
- // #region 检查参数输入
- // if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- // {
- // singleColumnName = "TmpColumn";
- // }
- // else
- // {
- // throw (new EntityException("keyList参数必须是基础类型的列表。"));
- // }
- // if (singleKey.Body.NodeType != ExpressionType.MemberAccess)
- // {
- // throw (new EntityException("singleKey参数必须是MemberAccess类型的Expression"));
- // }
- // #endregion
- // string tmpTableName = "##DeleteTemp" + Guid.NewGuid().ToString().Replace("-", "");
- // db.BulkCopyToTempTable(tmpTableName, keyList, singleColumnName);
- // string sql = @"
- //delete t
- //from " + tableName + @" t
- //inner join " + tmpTableName + @" tmp on ";
- // if (singleColumnName != "")
- // {
- // sql += "t.[" + ((MemberExpression)singleKey.Body).Member.Name + "]=tmp.TmpColumn";
- // }
- // var command = new SqlCommand(sql, db);
- // command.CommandTimeout = 12000;
- // command.CommandType = CommandType.Text;
- // command.ExecuteNonQuery();
- // command.CommandText = "drop table " + tmpTableName;
- // command.CommandType = System.Data.CommandType.Text;
- // command.ExecuteNonQuery();
- // }
- /// <summary>
- /// 只有预计关键字数量比较多的时候才使用
- /// </summary>
- /// <typeparam name="TEntity"></typeparam>
- /// <typeparam name="TKeys"></typeparam>
- /// <param name="queryable"></param>
- /// <param name="keyList"></param>
- /// <returns></returns>
- public static IList<TEntity> SelectByKeys<TEntity, TKeys>(this IQueryable<TEntity> queryable, IEnumerable<TKeys> keyList) where TEntity : class
- {
- var keyType = typeof(TKeys);
- IList<TEntity> result = new List<TEntity>();
- var resultProperties = typeof(TEntity).GetProperties();
- if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- {
- throw (new EntityException("keyList参数必须是复杂类型的列表。"));
- }
- var tableGuid = Guid.NewGuid().ToString().Replace("-", "");
- var columnString = tableGuid.Substring(10, 4);
- string tmpTableName = "##SelectTemp" + tableGuid;
- SqlConnection conn;
- if (SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn = SqlConnectionManager.GetConnection(queryable.GetConnectionKey());
- }
- else
- {
- //conn = new SqlConnection(queryable.GetConnection().ConnectionString);
- conn = (SqlConnection)queryable.GetConnection();
- }
- var parameters = queryable.GetParamters();
- conn.BulkCopyToTempTable(tmpTableName, keyList);
- string sql = @"
- select t.*
- from (
- " + queryable.ToString() + @"
- ) t
- inner join " + tmpTableName + @" tmp on ";
- var keyExpression = "";
- foreach (var property in keyType.GetProperties())
- {
- if (property.PropertyType.IsValueType || property.PropertyType.Name.StartsWith("String"))
- {
- var field = property.Name;
- if (keyExpression != "")
- {
- keyExpression += " and ";
- }
- keyExpression += "t.[" + field + "]" + "=tmp.[" + field + "]";
- }
- }
- sql += keyExpression;
- var command = new SqlCommand(sql, conn);
- command.CommandTimeout = 12000;
- command.CommandType = CommandType.Text;
- foreach (var parameter in parameters)
- {
- SqlParameter sqlParameter = new SqlParameter();
- sqlParameter.ParameterName = parameter.Name;
- sqlParameter.Value = parameter.Value;
- command.Parameters.Add(sqlParameter);
- }
- var reader = command.ExecuteReader();
- result = ParseDataReaderToEntity<TEntity>(queryable.Expression, reader);
- command.CommandText = "drop table " + tmpTableName;
- command.CommandType = System.Data.CommandType.Text;
- command.ExecuteNonQuery();
- if (!SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn.Close();
- }
- return result;
- }
- private static List<TEntity> ParseDataReaderToEntity<TEntity>(SqlDataReader reader)
- {
- var result = new List<TEntity>();
- var entityType = typeof(TEntity);
- try
- {
- var resultProperties = entityType.GetProperties();
- while (reader.Read())
- {
- TEntity entity;
- if (!entityType.Name.Contains("<>f__AnonymousType"))
- {
- entity = (TEntity)entityType.Assembly.CreateInstance(entityType.FullName);
- for (var i = 0; i < resultProperties.Length; i++)
- {
- try
- {
- resultProperties[i].SetValue(entity, reader[resultProperties[i].Name], null);
- }
- catch
- {
- }
- }
- }
- else
- {
- var objAttrs = new object[resultProperties.Length];
- for (var i = 0; i < resultProperties.Length; i++)
- {
- objAttrs[i] = reader[resultProperties[i].Name];
- }
- entity = (TEntity)Activator.CreateInstance(entityType, objAttrs);
- }
- result.Add(entity);
- }
- }
- catch
- { }
- finally
- {
- reader.Close();
- }
- return result;
- }
- private static List<TEntity> ParseDataReaderToEntity<TEntity>(Expression queryExpression, SqlDataReader reader)
- {
- if (queryExpression.NodeType != ExpressionType.Call)
- {
- return ParseDataReaderToEntity<TEntity>(reader);
- }
- if (!(((MethodCallExpression)queryExpression).Method.Name == "Select" && ((MethodCallExpression)queryExpression).Arguments.Count == 2))
- {
- return ParseDataReaderToEntity<TEntity>(reader);
- }
- if (((MethodCallExpression)queryExpression).Arguments[1].NodeType != ExpressionType.Quote)
- {
- return ParseDataReaderToEntity<TEntity>(reader);
- }
- var initialExpression = ((UnaryExpression)((MethodCallExpression)queryExpression).Arguments[1]).Operand;
- if (initialExpression.NodeType == ExpressionType.Lambda)
- {
- var bodyExpression = ((LambdaExpression)initialExpression).Body;
- if (bodyExpression.NodeType == ExpressionType.MemberInit)
- {
- var bindList = ((MemberInitExpression)bodyExpression).Bindings;
- var result = new List<TEntity>();
- var entityType = typeof(TEntity);
- try
- {
- while (reader.Read())
- {
- TEntity entity;
- var offset = reader.FieldCount - bindList.Count;
- if (!entityType.Name.Contains("<>f__AnonymousType"))
- {
- entity = (TEntity)entityType.Assembly.CreateInstance(entityType.FullName);
- for (var i = 0; i < bindList.Count; i++)
- {
- try
- {
- ((PropertyInfo)bindList[i].Member).SetValue(entity, reader[i + offset], null);
- }
- catch
- {
- }
- }
- }
- else
- {
- var objAttrs = new object[bindList.Count];
- for (var i = 0; i < bindList.Count; i++)
- {
- objAttrs[i] = reader[i];
- }
- entity = (TEntity)Activator.CreateInstance(entityType, objAttrs);
- }
- result.Add(entity);
- }
- }
- catch
- { }
- finally
- {
- reader.Close();
- }
- return result;
- }
- else
- {
- return ParseDataReaderToEntity<TEntity>(reader);
- }
- }
- else
- {
- return ParseDataReaderToEntity<TEntity>(reader);
- }
- }
- /// <summary>
- /// 只有预计关键字数量比较多的时候才使用
- /// </summary>
- /// <typeparam name="TEntity"></typeparam>
- /// <typeparam name="TKeys"></typeparam>
- /// <param name="repository"></param>
- /// <param name="keyList"></param>
- /// <returns></returns>
- public static IList<TEntity> SelectByKeys<TEntity, TKeys>(this DbSet<TEntity> dbSet, IEnumerable<TKeys> keyList) where TEntity : class
- {
- var keyType = typeof(TKeys);
- string tableName = typeof(TEntity).Name;
- IList<TEntity> result = new List<TEntity>();
- var resultProperties = typeof(TEntity).GetProperties();
- if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- {
- throw (new EntityException("keyList参数必须是复杂类型的列表。"));
- }
- string tmpTableName = "##SelectTemp" + Guid.NewGuid().ToString().Replace("-", "");
- SqlConnection conn;
- if (SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn = SqlConnectionManager.GetConnection(dbSet.AsQueryable().GetConnectionKey());
- }
- else
- {
- //conn = new SqlConnection(dbSet.AsQueryable().GetConnection().ConnectionString);
- conn = (SqlConnection)dbSet.AsQueryable().GetConnection();
- }
- conn.BulkCopyToTempTable(tmpTableName, keyList);
- string sql = @"
- select t.*
- from " + tableName + @" t
- inner join " + tmpTableName + @" tmp on ";
- var keyExpression = "";
- foreach (var property in keyType.GetProperties())
- {
- if (property.PropertyType.IsValueType || property.PropertyType.Name.StartsWith("String"))
- {
- var field = property.Name;
- if (keyExpression != "")
- {
- keyExpression += " and ";
- }
- keyExpression += "t.[" + field + "]" + "=tmp.[" + field + "]";
- }
- }
- sql += keyExpression;
- var command = new SqlCommand(sql, conn);
- command.CommandTimeout = 12000;
- command.CommandType = CommandType.Text;
- var reader = command.ExecuteReader();
- result = ParseDataReaderToEntity<TEntity>(reader);
- command.CommandText = "drop table " + tmpTableName;
- command.CommandType = System.Data.CommandType.Text;
- command.ExecuteNonQuery();
- if (!SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn.Close();
- }
- return result;
- }
- public static IList<TEntity> SelectByKeys<TEntity, TKeys, TMatchKey>(this DbSet<TEntity> dbSet, IEnumerable<TKeys> keyList, Expression<Func<TEntity, TMatchKey>> singleKey) where TEntity : class
- {
- var keyType = typeof(TKeys);
- string tableName = typeof(TEntity).Name;
- var singleColumnName = "";
- IList<TEntity> result = new List<TEntity>();
- var resultProperties = typeof(TEntity).GetProperties();
- #region 检查参数输入
- if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- {
- singleColumnName = "TmpColumn";
- }
- else
- {
- throw (new EntityException("keyList参数必须是基础类型的列表。"));
- }
- if (singleKey.Body.NodeType != ExpressionType.MemberAccess)
- {
- throw (new EntityException("singleKey参数必须是MemberAccess类型的Expression"));
- }
- #endregion
- string tmpTableName = "##SelectTemp" + Guid.NewGuid().ToString().Replace("-", "");
- SqlConnection conn;
- if (SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn = SqlConnectionManager.GetConnection(dbSet.AsQueryable().GetConnectionKey());
- }
- else
- {
- //conn = new SqlConnection(dbSet.AsQueryable().GetConnection().ConnectionString);
- conn = (SqlConnection)dbSet.AsQueryable().GetConnection();
- }
- conn.BulkCopyToTempTable(tmpTableName, keyList, singleColumnName);
- string sql = @"
- select t.*
- from " + tableName + @" t
- inner join " + tmpTableName + @" tmp on ";
- if (singleColumnName != "")
- {
- sql += "t.[" + ((MemberExpression)singleKey.Body).Member.Name + "]=tmp.TmpColumn";
- }
- var command = new SqlCommand(sql, conn);
- command.CommandTimeout = 12000;
- command.CommandType = CommandType.Text;
- var reader = command.ExecuteReader();
- result = ParseDataReaderToEntity<TEntity>(reader);
- command.CommandText = "drop table " + tmpTableName;
- command.CommandType = System.Data.CommandType.Text;
- command.ExecuteNonQuery();
- if (!SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn.Close();
- }
- return result;
- }
- public static IList<TEntity> SelectByKeys<TEntity, TKeys, TMatchKey>(this IQueryable<TEntity> queryable, IEnumerable<TKeys> keyList, Expression<Func<TEntity, TMatchKey>> singleKey) where TEntity : class
- {
- var keyType = typeof(TKeys);
- var singleColumnName = "";
- IList<TEntity> result = new List<TEntity>();
- var resultProperties = typeof(TEntity).GetProperties();
- #region 检查参数输入
- if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- {
- singleColumnName = "TmpColumn";
- }
- else
- {
- throw (new EntityException("keyList参数必须是基础类型的列表。"));
- }
- if (singleKey.Body.NodeType != ExpressionType.MemberAccess)
- {
- throw (new EntityException("singleKey参数必须是MemberAccess类型的Expression"));
- }
- #endregion
- var tableGuid = Guid.NewGuid().ToString().Replace("-", "");
- var columnString = tableGuid.Substring(10, 4);
- string tmpTableName = "##SelectTemp" + Guid.NewGuid().ToString().Replace("-", "");
- SqlConnection conn;
- if (SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn = SqlConnectionManager.GetConnection(queryable.GetConnectionKey());
- }
- else
- {
- //conn = new SqlConnection(queryable.GetConnection().ConnectionString);
- conn = (SqlConnection)queryable.GetConnection();
- }
- var parameters = queryable.GetParamters();
- singleColumnName = singleColumnName + columnString;
- conn.BulkCopyToTempTable(tmpTableName, keyList, singleColumnName);
- string sql = @"
- select t.*
- from (
- " + queryable.ToString() + @"
- ) t
- inner join " + tmpTableName + @" tmp on ";
- if (singleColumnName != "")
- {
- sql += "t.[" + ((MemberExpression)singleKey.Body).Member.Name + "]=tmp." + singleColumnName;
- }
- var command = new SqlCommand(sql, conn);
- command.CommandTimeout = 12000;
- command.CommandType = CommandType.Text;
- foreach (var parameter in parameters)
- {
- SqlParameter sqlParameter = new SqlParameter();
- sqlParameter.ParameterName = parameter.Name;
- sqlParameter.Value = parameter.Value;
- command.Parameters.Add(sqlParameter);
- }
- var reader = command.ExecuteReader();
- result = ParseDataReaderToEntity<TEntity>(queryable.Expression, reader);
- command.CommandText = "drop table " + tmpTableName;
- command.CommandType = System.Data.CommandType.Text;
- command.ExecuteNonQuery();
- if (!SqlConnectionManager.IsGlobalConnectionStarted)
- {
- conn.Close();
- }
- return result;
- }
- public static IList<TEntity> SelectByKeys<TEntity, TKeys, TMatchKey>(this DbSet<TEntity> dbSet, SqlConnection db,
- IEnumerable<TKeys> keyList, Expression<Func<TEntity, TMatchKey>> singleKey) where TEntity : class
- {
- var keyType = typeof(TKeys);
- string tableName = typeof(TEntity).Name;
- var singleColumnName = "";
- IList<TEntity> result = new List<TEntity>();
- var resultProperties = typeof(TEntity).GetProperties();
- #region 检查参数输入
- if (keyType.IsValueType || keyType.Name.StartsWith("String"))
- {
- singleColumnName = "TmpColumn";
- }
- else
- {
- throw (new EntityException("keyList参数必须是基础类型的列表。"));
- }
- if (singleKey.Body.NodeType != ExpressionType.MemberAccess)
- {
- throw (new EntityException("singleKey参数必须是MemberAccess类型的Expression"));
- }
- #endregion
- string tmpTableName = "##SelectTemp" + Guid.NewGuid().ToString().Replace("-", "");
- db.BulkCopyToTempTable(tmpTableName, keyList, singleColumnName);
- string sql = @"
- select t.*
- from " + tableName + @" t
- inner join " + tmpTableName + @" tmp on ";
- if (singleColumnName != "")
- {
- sql += "t.[" + ((MemberExpression)singleKey.Body).Member.Name + "]=tmp.TmpColumn";
- }
- var command = new SqlCommand(sql, db);
- command.CommandTimeout = 12000;
- command.CommandType = CommandType.Text;
- var reader = command.ExecuteReader();
- result = ParseDataReaderToEntity<TEntity>(reader);
- command.CommandText = "drop table " + tmpTableName;
- command.CommandType = System.Data.CommandType.Text;
- command.ExecuteNonQuery();
- return result;
- }
- /// <summary>
- /// 批次更新
- /// </summary>
- //public static int Update<TEntity>(this DbContext db, Expression<Func<TEntity, TEntity>> setExpression, Expression<Func<TEntity, bool>> whereExpression) where TEntity : class
- //{
- // var context = ((IObjectContextAdapter)db).ObjectContext;
- // IObjectSet<TEntity> source = context.CreateObjectSet<TEntity>();
- // return source.Update(whereExpression, setExpression);
- // //return source.Update(setExpression, whereExpression);
- //}
- //public static void CommitWithoutValidate(this DbContext db)
- //{
- // db.Configuration.ValidateOnSaveEnabled = false;
- // db.SaveChanges();
- // db.Configuration.ValidateOnSaveEnabled = true;
- //}
- ///// <summary>
- ///// 批量更新
- ///// </summary>
- ///// <typeparam name="TEntity"></typeparam>
- ///// <typeparam name="TField"></typeparam>
- ///// <typeparam name="TKey"></typeparam>
- ///// <param name="uow"></param>
- ///// <param name="data"></param>
- ///// <param name="fields"></param>
- ///// <param name="keys"></param>
- //public static void Update<TEntity, TField, TKey>(this DbContext db, IList<TEntity> data, Expression<Func<TEntity, TField>> fields,
- // Expression<Func<TEntity, TKey>> keys) where TEntity : class
- //{
- // string setField = "";
- // string keyExpression = "";
- // string tableName = typeof(TEntity).Name;
- // if (fields.Body.NodeType != ExpressionType.MemberAccess && fields.Body.NodeType != ExpressionType.MemberInit && fields.Body.NodeType != ExpressionType.New)
- // {
- // throw (new EntityException("fields参数必须是MemberAccess、MemberInit或New类型的Expression"));
- // }
- // if (keys.Body.NodeType != ExpressionType.MemberAccess && keys.Body.NodeType != ExpressionType.MemberInit && keys.Body.NodeType != ExpressionType.New)
- // {
- // throw (new EntityException("keys参数必须是MemberAccess、MemberInit或New类型的Expression"));
- // }
- // if (fields.Body.NodeType != ExpressionType.MemberAccess)
- // {
- // foreach (var bindingMember in ((NewExpression)fields.Body).Members)
- // {
- // if (bindingMember.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // if (((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.IsValueType
- // || ((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.Name.StartsWith("String"))
- // {
- // var field = bindingMember.Name;
- // if (setField != "")
- // {
- // setField += ",";
- // }
- // setField += "[" + field + "]" + "=dest.[" + field + "]";
- // }
- // }
- // }
- // }
- // else
- // {
- // if (((MemberExpression)fields.Body).Member.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // var propertyInfo = ((System.Reflection.PropertyInfo)((MemberExpression)fields.Body).Member);
- // if (propertyInfo.PropertyType.IsValueType || propertyInfo.PropertyType.Name.StartsWith("String"))
- // {
- // setField = "[" + propertyInfo.Name + "]" + "=dest.[" + propertyInfo.Name + "]";
- // }
- // }
- // }
- // if (keys.Body.NodeType != ExpressionType.MemberAccess)
- // {
- // foreach (var bindingMember in ((NewExpression)keys.Body).Members)
- // {
- // if (bindingMember.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // if (((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.IsValueType
- // || ((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.Name.StartsWith("String"))
- // {
- // var key = bindingMember.Name;
- // if (keyExpression != "")
- // {
- // keyExpression += " and ";
- // }
- // keyExpression += "source.[" + key + "]" + "=dest.[" + key + "]";
- // }
- // }
- // }
- // }
- // else
- // {
- // if (((MemberExpression)keys.Body).Member.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // var propertyInfo = ((System.Reflection.PropertyInfo)((MemberExpression)keys.Body).Member);
- // if (propertyInfo.PropertyType.IsValueType || propertyInfo.PropertyType.Name.StartsWith("String"))
- // {
- // keyExpression = "source.[" + propertyInfo.Name + "]" + "=dest.[" + propertyInfo.Name + "]";
- // }
- // }
- // }
- // string tmpTableName = "##UpdateTemp" + Guid.NewGuid().ToString().Replace("-", "");
- // SqlConnection conn;
- // if (SqlConnectionManager.IsGlobalConnectionStarted)
- // {
- // conn = SqlConnectionManager.GetConnection(db.GetDbConnectionKey());
- // }
- // else
- // {
- // conn = new SqlConnection(db.Database.Connection.ConnectionString);
- // }
- // conn.BulkCopyToTempTable(tmpTableName, data);
- // string sql = @"update " + tableName + @" set " + setField + @" from " + tableName + @" source inner join " + tmpTableName + @" dest on " + keyExpression;
- // var command = new SqlCommand(sql, conn);
- // command.CommandTimeout = 12000;
- // command.CommandType = System.Data.CommandType.Text;
- // command.ExecuteNonQuery();
- // try
- // {
- // command.CommandText = "drop table " + tmpTableName;
- // command.CommandType = System.Data.CommandType.Text;
- // command.ExecuteNonQuery();
- // }
- // catch { }
- // if (!SqlConnectionManager.IsGlobalConnectionStarted)
- // {
- // conn.Close();
- // }
- //}
- ///// <summary>
- ///// 批量更新
- ///// </summary>
- ///// <typeparam name="TEntity"></typeparam>
- ///// <typeparam name="TField"></typeparam>
- ///// <typeparam name="TKey"></typeparam>
- ///// <param name="uow"></param>
- ///// <param name="data"></param>
- ///// <param name="fields"></param>
- ///// <param name="keys"></param>
- //public static void Update<TEntity, TField, TKey>(this SqlConnection db, IList<TEntity> data, Expression<Func<TEntity, TField>> fields,
- // Expression<Func<TEntity, TKey>> keys) where TEntity : class
- //{
- // string setField = "";
- // string keyExpression = "";
- // string tableName = typeof(TEntity).Name;
- // if (fields.Body.NodeType != ExpressionType.MemberAccess && fields.Body.NodeType != ExpressionType.MemberInit && fields.Body.NodeType != ExpressionType.New)
- // {
- // throw (new EntityException("fields参数必须是MemberAccess、MemberInit或New类型的Expression"));
- // }
- // if (keys.Body.NodeType != ExpressionType.MemberAccess && keys.Body.NodeType != ExpressionType.MemberInit && keys.Body.NodeType != ExpressionType.New)
- // {
- // throw (new EntityException("keys参数必须是MemberAccess、MemberInit或New类型的Expression"));
- // }
- // if (fields.Body.NodeType != ExpressionType.MemberAccess)
- // {
- // foreach (var bindingMember in ((NewExpression)fields.Body).Members)
- // {
- // if (bindingMember.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // if (((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.IsValueType
- // || ((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.Name.StartsWith("String"))
- // {
- // var field = bindingMember.Name;
- // if (setField != "")
- // {
- // setField += ",";
- // }
- // setField += "[" + field + "]" + "=dest.[" + field + "]";
- // }
- // }
- // }
- // }
- // else
- // {
- // if (((MemberExpression)fields.Body).Member.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // var propertyInfo = ((System.Reflection.PropertyInfo)((MemberExpression)fields.Body).Member);
- // if (propertyInfo.PropertyType.IsValueType || propertyInfo.PropertyType.Name.StartsWith("String"))
- // {
- // setField = "[" + propertyInfo.Name + "]" + "=dest.[" + propertyInfo.Name + "]";
- // }
- // }
- // }
- // if (keys.Body.NodeType != ExpressionType.MemberAccess)
- // {
- // foreach (var bindingMember in ((NewExpression)keys.Body).Members)
- // {
- // if (bindingMember.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // if (((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.IsValueType
- // || ((System.Reflection.PropertyInfo)(bindingMember)).PropertyType.Name.StartsWith("String"))
- // {
- // var key = bindingMember.Name;
- // if (keyExpression != "")
- // {
- // keyExpression += " and ";
- // }
- // keyExpression += "source.[" + key + "]" + "=dest.[" + key + "]";
- // }
- // }
- // }
- // }
- // else
- // {
- // if (((MemberExpression)keys.Body).Member.MemberType == System.Reflection.MemberTypes.Property)
- // {
- // var propertyInfo = ((System.Reflection.PropertyInfo)((MemberExpression)keys.Body).Member);
- // if (propertyInfo.PropertyType.IsValueType || propertyInfo.PropertyType.Name.StartsWith("String"))
- // {
- // keyExpression = "source.[" + propertyInfo.Name + "]" + "=dest.[" + propertyInfo.Name + "]";
- // }
- // }
- // }
- // string tmpTableName = "##UpdateTemp" + Guid.NewGuid().ToString().Replace("-", "");
- // db.BulkCopyToTempTable(tmpTableName, data);
- // string sql = @"update " + tableName + @" set " + setField + @" from " + tableName + @" source inner join " + tmpTableName + @" dest on " + keyExpression;
- // var command = new SqlCommand(sql, db);
- // command.CommandTimeout = 12000;
- // command.CommandType = System.Data.CommandType.Text;
- // command.ExecuteNonQuery();
- // try
- // {
- // command.CommandText = "drop table " + tmpTableName;
- // command.CommandType = System.Data.CommandType.Text;
- // command.ExecuteNonQuery();
- // }
- // catch { }
- //}
- // /// <summary>
- // /// 批量更新
- // /// </summary>
- // /// <typeparam name="TEntity"></typeparam>
- // /// <typeparam name="TUpdateFields"></typeparam>
- // /// <param name="db"></param>
- // /// <param name="fromCause"></param>
- // /// <param name="fields"></param>
- // public static void Update<TEntity>(this DbContext db, IQueryable<TEntity> fromCause, Expression<Func<TEntity, TEntity>> fields)
- // {
- // IList<ObjectParameter> para = new List<ObjectParameter>();
- // string sql = fromCause.ToString();
- // string setField = "";
- // string tableKey = TableKeyDictionary.GetKeyName<TEntity>();
- // if (fields.Body.NodeType != ExpressionType.MemberInit)
- // {
- // throw (new EntityException("fields参数必须是MemberInit类型的Expression"));
- // }
- // foreach (var bindingExpression in ((MemberInitExpression)fields.Body).Bindings)
- // {
- // var field = bindingExpression.Member.Name;
- // if (setField != "")
- // {
- // setField += ",";
- // }
- // if (((System.Linq.Expressions.MemberAssignment)(bindingExpression)).Expression.NodeType == ExpressionType.MemberAccess)
- // {
- // setField += "[" + field + "]" + "=x.[" + ((MemberExpression)((System.Linq.Expressions.MemberAssignment)(bindingExpression)).Expression).Member.Name + "]";
- // }
- // else
- // {
- // var obj = Expression.Lambda(((System.Linq.Expressions.MemberAssignment)(bindingExpression)).Expression).Compile().DynamicInvoke(null);
- // setField += "[" + field + "]" + "=@setPara" + field;
- // }
- // }
- // fromCause.GetParamters().ToList().ForEach(x => para.Add(x));
- // sql = "update " + typeof(TEntity).Name + " set " + setField + @"
- //from " + typeof(TEntity).Name + @" a
- //inner join (" + sql + ") x on a.[" + tableKey + "]=x.[" + tableKey + "]";
- // db.Database.ExecuteSqlCommand(sql, para.ToArray());
- // }
- /// <summary>
- /// 批次刪除
- /// </summary>
- public static int Delete<TEntity>(this DbContext db, Expression<Func<TEntity, bool>> whereExpression) where TEntity : class
- {
- var context = ((IObjectContextAdapter)db).ObjectContext;
- IObjectSet<TEntity> source = context.CreateObjectSet<TEntity>();
- return source.Delete(whereExpression);
- }
- public static void Delete(this SqlConnection db, string tableName, string keyName, object keyValue)
- {
- var initState = db.State;
- if (initState == ConnectionState.Closed)
- {
- db.Open();
- }
- var sql = @"delete from " + tableName + " where " + keyName + "=@keyValue";
- var command = new SqlCommand(sql, db);
- command.CommandTimeout = 12000;
- command.CommandType = System.Data.CommandType.Text;
- command.Parameters.Add("@keyValue", SqlDbType.UniqueIdentifier);
- command.Parameters[0].IsNullable = true;
- command.Parameters[0].Value = keyValue;
- command.ExecuteNonQuery();
- if (initState == ConnectionState.Closed)
- {
- db.Close();
- }
- }
- public static List<string> GetTableColumns(this SqlConnection db, string tableName)
- {
- var initState = db.State;
- if (initState == ConnectionState.Closed)
- {
- db.Open();
- }
- var sql = @"
- select * from syscolumns c
- inner join sysobjects o on c.id=o.id
- where o.xtype='U' and o.name='" + tableName + @"'
- order by colid";
- var da = new SqlDataAdapter(sql, db);
- DataTable dt = new DataTable();
- da.Fill(dt);
- if (initState == ConnectionState.Closed)
- {
- db.Close();
- }
- return dt.AsEnumerable().Select(x => x.Field<string>("name")).ToList();
- }
- //public static void Delete<TEntity>(this DbContext db, TEntity entity) where TEntity : class
- //{
- // var typeOfEntity = typeof(TEntity);
- // var mappingClass = typeOfEntity.Assembly.GetTypes().Where(x => x.Name == typeOfEntity.Name + "_Mapping").FirstOrDefault();
- // var tableKeyName = TableKeyDictionary.GetKeyName(entity);
- // var keyProperty = typeOfEntity.GetProperty(tableKeyName);
- // var tracker = db.ChangeTracker.Entries<TEntity>().Where(x => keyProperty.GetValue(x.Entity, null) == keyProperty.GetValue(entity, null)).FirstOrDefault();
- // if (tracker != null)
- // {
- // db.Set<TEntity>().Remove(tracker.Entity);
- // }
- // else
- // {
- // db.Set<TEntity>().Attach(entity);
- // db.Set<TEntity>().Remove(entity);
- // }
- //}
- //public static void InsertBatch<TEntity>(this IList<TEntity> data) where TEntity : class
- //{
- // var db = GetConnections<TEntity>();
- // data.ExecuteBulkCopy(db, typeof(TEntity).Name);
- //}
- public static SqlConnection GetConnections<TEntity>()
- {
- var blAssembly = Assembly.GetExecutingAssembly();
- var entityType = typeof(TEntity);
- if (entityType.BaseType != typeof(object))
- {
- entityType = entityType.BaseType;
- }
- var myClass = blAssembly.GetTypes()
- .Where(x => x.Name.EndsWith("Repository") &&
- x.BaseType.GetGenericArguments()[0].FullName == entityType.FullName)
- .FirstOrDefault();
- string connectionKey = "";
- var context = myClass.BaseType.GetGenericArguments()[0].Assembly.GetTypes().Where(x => x.BaseType == typeof(DbContext)).FirstOrDefault();
- connectionKey = context.Name;
- if (SqlConnectionManager.IsGlobalConnectionStarted)
- {
- return SqlConnectionManager.GetConnection(connectionKey);
- }
- else
- {
- return new SqlConnection(ConfigurationManager.ConnectionStrings[connectionKey].ConnectionString);
- }
- }
- public static PropertyInfo GetPK(this EntityObject value)
- {
- //var metadata = ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace;
- //var a = metadata.GetItems(DataSpace.OSpace);
- return null;
- }
- }
- }
|