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 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 = (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);
- }
- }
-
-
-
-
-
-
-
-
- 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 = (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 = (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 = (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;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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 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)
- {
-
-
- return null;
- }
- }
- }
|