mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-10-21 02:57:33 +08:00
Support Mapper Many to Many
This commit is contained in:
@@ -98,9 +98,9 @@ namespace OrmTest
|
|||||||
|
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
//var list8 = Db.Queryable<A>()
|
var list8 = Db.Queryable<A>()
|
||||||
//.Mapper<ABMapping>(it=>ManyToMany.Config(it.A,it.AId,it.B,it.BId))
|
.Mapper<A,B,ABMapping>(it => ManyToMany.Config(it.AId,it.BId))
|
||||||
//.ToList();
|
.ToList();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -109,10 +109,91 @@ namespace SqlSugar
|
|||||||
this.MapperAction.Add(mapperAction);
|
this.MapperAction.Add(mapperAction);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
public ISugarQueryable<T> Mapper<MappingType>(Expression<Func<MappingType, ManyToMany>> expression)
|
public ISugarQueryable<T> Mapper<AType, BType, MappingType>(Expression<Func<MappingType, ManyToMany>> expression)
|
||||||
{
|
{
|
||||||
|
var args = ((expression as LambdaExpression).Body as MethodCallExpression).Arguments;
|
||||||
|
|
||||||
|
Type aType = typeof(AType);
|
||||||
|
Type bType = typeof(BType);
|
||||||
|
Type bListType = typeof(List<BType>);
|
||||||
|
|
||||||
|
this.Context.InitMappingInfo(aType);
|
||||||
|
this.Context.InitMappingInfo(bType);
|
||||||
|
this.Context.InitMappingInfo(typeof(MappingType));
|
||||||
|
|
||||||
|
//Mapping
|
||||||
|
var mappingEntity = this.Context.EntityMaintenance.GetEntityInfo(typeof(MappingType));
|
||||||
|
string m_aPropertyName = (args[0] as MemberExpression).Member.Name;
|
||||||
|
string m_bPropertyName= (args[1] as MemberExpression).Member.Name;
|
||||||
|
var m_aDbField = mappingEntity.Columns.First(it => it.PropertyName == m_aPropertyName).DbColumnName;
|
||||||
|
var m_bDbField = mappingEntity.Columns.First(it => it.PropertyName == m_bPropertyName).DbColumnName;
|
||||||
|
|
||||||
|
//A
|
||||||
|
var aEntity = this.Context.EntityMaintenance.GetEntityInfo(aType);
|
||||||
|
var aPropertyName = aEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true).PropertyName;
|
||||||
|
|
||||||
|
//B
|
||||||
|
var bEntity = this.Context.EntityMaintenance.GetEntityInfo(bType);
|
||||||
|
var bProperty = bEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true).PropertyName;
|
||||||
|
var bDbFiled = bEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true).DbColumnName;
|
||||||
|
this.Mapper((it,cache) =>
|
||||||
|
{
|
||||||
|
var list= cache.Get<Dictionary<object, List<BType>>>(oldList=> {
|
||||||
|
|
||||||
|
|
||||||
|
//query mapping by a
|
||||||
|
var cons = new List<IConditionalModel>() {
|
||||||
|
new ConditionalModel(){
|
||||||
|
ConditionalType=ConditionalType.In,
|
||||||
|
FieldName= m_aDbField,
|
||||||
|
FieldValue=string.Join(",",oldList.Select(z=>UtilMethods.GetPropertyValue(z,aPropertyName)).Distinct())
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var mappingList = this.Context.Queryable<MappingType>().Where(cons).ToList();
|
||||||
|
var bids = mappingList.Select(z => UtilMethods.GetPropertyValue(z, m_bPropertyName)).Distinct().ToList();
|
||||||
|
|
||||||
|
//queryable b by mapping
|
||||||
|
cons = new List<IConditionalModel>() {
|
||||||
|
new ConditionalModel(){
|
||||||
|
ConditionalType=ConditionalType.In,
|
||||||
|
FieldName= bDbFiled,
|
||||||
|
FieldValue=string.Join(",",mappingList.Select(z=>UtilMethods.GetPropertyValue(z,m_bPropertyName)).Distinct())
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var bList = this.Context.Queryable<BType>().Where(cons).ToList();
|
||||||
|
|
||||||
|
//get result
|
||||||
|
Dictionary<object, List<BType>> result = new Dictionary<object, List<BType>>();
|
||||||
|
var group = mappingList.GroupBy(z => UtilMethods.GetPropertyValue(z, m_aPropertyName));
|
||||||
|
foreach (var item in group)
|
||||||
|
{
|
||||||
|
var currentBids = item.Select(z => UtilMethods.GetPropertyValue(z, m_bPropertyName)).ToList();
|
||||||
|
result.Add(item.Key, bList.Where(z => currentBids.Contains(UtilMethods.GetPropertyValue(z, bProperty))).ToList());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}, expression.ToString());
|
||||||
|
foreach (var item in aEntity.Columns)
|
||||||
|
{
|
||||||
|
var aid = UtilMethods.GetPropertyValue(it, aPropertyName);
|
||||||
|
if (list.ContainsKey(aid))
|
||||||
|
{
|
||||||
|
if (item.PropertyInfo.PropertyType == bType)
|
||||||
|
{
|
||||||
|
var b=UtilMethods.ChangeType<BType>(list[aid].FirstOrDefault());
|
||||||
|
item.PropertyInfo.SetValue(it, b);
|
||||||
|
}
|
||||||
|
else if (item.PropertyInfo.PropertyType == bListType)
|
||||||
|
{
|
||||||
|
var bList = UtilMethods.ChangeType<List<BType>>(list[aid]);
|
||||||
|
item.PropertyInfo.SetValue(it, bList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual ISugarQueryable<T> Mapper(Action<T, MapperCache<T>> mapperAction)
|
public virtual ISugarQueryable<T> Mapper(Action<T, MapperCache<T>> mapperAction)
|
||||||
{
|
{
|
||||||
this.MapperActionWithCache = mapperAction;
|
this.MapperActionWithCache = mapperAction;
|
||||||
|
@@ -8,11 +8,7 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
public class ManyToMany
|
public class ManyToMany
|
||||||
{
|
{
|
||||||
public static ManyToMany Config<AClass,AField,BClass,BField>(AClass aClass,AField aField,BClass bClass,BField bField)
|
public static ManyToMany Config<AField,BField>(AField aField,BField bField)
|
||||||
where AClass:class
|
|
||||||
where AField : struct
|
|
||||||
where BClass:class
|
|
||||||
where BField:struct
|
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@@ -34,6 +34,21 @@ namespace SqlSugar
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public Result Get<Result>(Func<List<T>, Result> action,string cachekey)
|
||||||
|
{
|
||||||
|
GetIndex++;
|
||||||
|
string key = "Get" + typeof(Result) + action.GetHashCode() + action.Method.Name+ cachekey;
|
||||||
|
if (caches.ContainsKey(key))
|
||||||
|
{
|
||||||
|
return (Result)caches[key];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var result = action(_list);
|
||||||
|
caches.Add(key, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
public List<Result> GetListByPrimaryKeys<Result>(Func<T, double?> action) where Result : class, new()
|
public List<Result> GetListByPrimaryKeys<Result>(Func<T, double?> action) where Result : class, new()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
@@ -20,7 +20,7 @@ namespace SqlSugar
|
|||||||
ISugarQueryable<T> With(string withString);
|
ISugarQueryable<T> With(string withString);
|
||||||
ISugarQueryable<T> Filter(string FilterName, bool isDisabledGobalFilter = false);
|
ISugarQueryable<T> Filter(string FilterName, bool isDisabledGobalFilter = false);
|
||||||
ISugarQueryable<T> Mapper(Action<T> mapperAction);
|
ISugarQueryable<T> Mapper(Action<T> mapperAction);
|
||||||
ISugarQueryable<T> Mapper<MappingType>(Expression<Func<MappingType, ManyToMany>> expression);
|
ISugarQueryable<T> Mapper<AType, BType, MappingType>(Expression<Func<MappingType, ManyToMany>> expression);
|
||||||
ISugarQueryable<T> Mapper(Action<T, MapperCache<T>> mapperAction);
|
ISugarQueryable<T> Mapper(Action<T, MapperCache<T>> mapperAction);
|
||||||
ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField);
|
ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField);
|
||||||
ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField);
|
ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField);
|
||||||
|
@@ -244,7 +244,10 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
return Convert.ToInt64(string.Join("", bytes).PadRight(20, '0'));
|
return Convert.ToInt64(string.Join("", bytes).PadRight(20, '0'));
|
||||||
}
|
}
|
||||||
|
public static object GetPropertyValue<T>(T t, string PropertyName)
|
||||||
|
{
|
||||||
|
return t.GetType().GetProperty(PropertyName).GetValue(t, null);
|
||||||
|
}
|
||||||
internal static string GetMD5(string myString)
|
internal static string GetMD5(string myString)
|
||||||
{
|
{
|
||||||
MD5 md5 = new MD5CryptoServiceProvider();
|
MD5 md5 = new MD5CryptoServiceProvider();
|
||||||
|
Reference in New Issue
Block a user