mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-08-24 07:07:23 +08:00
Support on to many where( it.xx.count()>0)
This commit is contained in:
parent
1d0fe5b9d3
commit
1ea83c8323
@ -21,6 +21,17 @@ namespace OrmTest
|
|||||||
.Where(it => it.A.Name == "a")
|
.Where(it => it.A.Name == "a")
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
|
||||||
|
var list3 = Db.Queryable<Order>()
|
||||||
|
.Mapper(it => it.Items, it => it.Items.First().OrderId)
|
||||||
|
.Where(it => it.Items.Count() > 0)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var list6 = Db.Queryable<Order>()
|
||||||
|
.Mapper(it => it.Items, it => it.Items.First().OrderId)
|
||||||
|
.Where(it => it.Items.Any())
|
||||||
|
.ToList();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,6 +129,12 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mapperField)
|
public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mapperField)
|
||||||
{
|
{
|
||||||
|
Check.Exception(mapperObject.ReturnType.Name == "IList`1", "Mapper no support IList , Use List<T>");
|
||||||
|
if (CallContext.MapperExpression.Value == null)
|
||||||
|
{
|
||||||
|
CallContext.MapperExpression.Value = new List<MapperExpression>();
|
||||||
|
}
|
||||||
|
CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToN, FillExpression = mapperObject, MappingField1Expression = mapperField,Context = this.Context });
|
||||||
return _Mapper<TObject>(mapperObject, mapperField);
|
return _Mapper<TObject>(mapperObject, mapperField);
|
||||||
}
|
}
|
||||||
public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mapperField)
|
public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mapperField)
|
||||||
|
@ -33,7 +33,19 @@ namespace SqlSugar
|
|||||||
|
|
||||||
private void ResolveList()
|
private void ResolveList()
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var methodExpression = expression as MethodCallExpression;
|
||||||
|
var callName = methodExpression.Method.Name;
|
||||||
|
var exp= methodExpression.Arguments[0] as MemberExpression;
|
||||||
|
ThrowTrue(exp == null);
|
||||||
|
var childExpression = exp;
|
||||||
|
MapperExpression mapper = GetMapperMany(exp);
|
||||||
|
var fillInfo = GetFillInfoMany(childExpression, mapper);
|
||||||
|
var mappingFild1Info = GetMappingFild1ManyInfo(childExpression, mapper);
|
||||||
|
var mappingFild1Info2 = GetMappingFild2Info(childExpression, mapper);
|
||||||
|
//var SelectInfo = GetSelectInfo(expression);
|
||||||
|
this.context.InitMappingInfo(childExpression.Expression.Type);
|
||||||
|
var entity = this.context.EntityMaintenance.GetEntityInfo(childExpression.Expression.Type);
|
||||||
|
oneToMany(callName, entity, childExpression.Expression.ToString(), fillInfo, mappingFild1Info, mappingFild1Info2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ResolveMember()
|
private void ResolveMember()
|
||||||
@ -62,7 +74,7 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
else if (isFillFild1SameType)
|
else if (isFillFild1SameType)
|
||||||
{
|
{
|
||||||
oneToMany();
|
throw new NotSupportedException(expression.ToString());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -87,9 +99,31 @@ namespace SqlSugar
|
|||||||
.Select(sqlBuilder.GetTranslationColumnName(selectInfo.FieldName)).ToSql().Key;
|
.Select(sqlBuilder.GetTranslationColumnName(selectInfo.FieldName)).ToSql().Key;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void oneToMany()
|
private void oneToMany(string methodName,EntityInfo mainEntity,string shortName,MapperExpressionInfo fillInfo, MapperExpressionInfo mappingFild1Info, MapperExpressionInfo mappingFild1Info2)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var pkColumn = mainEntity.Columns.FirstOrDefault(it=>it.IsPrimarykey==true);
|
||||||
|
if (pkColumn == null)
|
||||||
|
{
|
||||||
|
pkColumn = mainEntity.Columns.FirstOrDefault();
|
||||||
|
}
|
||||||
|
var tableName = sqlBuilder.GetTranslationTableName(fillInfo.EntityInfo.DbTableName);
|
||||||
|
var whereLeft = sqlBuilder.GetTranslationColumnName(mappingFild1Info.FieldString);
|
||||||
|
var whereRight = sqlBuilder.GetTranslationColumnName(shortName+"."+pkColumn.DbColumnName);
|
||||||
|
|
||||||
|
if (methodName == "Any")
|
||||||
|
{
|
||||||
|
this.sql = " ("+this.context.Queryable<object>()
|
||||||
|
.AS(tableName)
|
||||||
|
.Where(string.Format(" {0}={1} ", whereLeft, whereRight))
|
||||||
|
.Select("COUNT(1)").ToSql().Key+")>0 ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.sql = this.context.Queryable<object>()
|
||||||
|
.AS(tableName)
|
||||||
|
.Where(string.Format(" {0}={1} ", whereLeft, whereRight))
|
||||||
|
.Select("COUNT(1)").ToSql().Key;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private MapperExpressionInfo GetSelectInfo(Expression expression)
|
private MapperExpressionInfo GetSelectInfo(Expression expression)
|
||||||
@ -205,6 +239,55 @@ namespace SqlSugar
|
|||||||
return new MapperSql() { Sql = " (" + this.sql + ") " };
|
return new MapperSql() { Sql = " (" + this.sql + ") " };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MapperExpression GetMapperMany(MemberExpression exp)
|
||||||
|
{
|
||||||
|
var mapper = mappers.Where(it => it.Type == MapperExpressionType.oneToN)
|
||||||
|
.Reverse()
|
||||||
|
.Where(it => (it.FillExpression as LambdaExpression).Body.ToString() == exp.ToString()).FirstOrDefault();
|
||||||
|
ThrowTrue(mapper == null);
|
||||||
|
return mapper;
|
||||||
|
}
|
||||||
|
private MapperExpressionInfo GetFillInfoMany(Expression childExpression, MapperExpression mapper)
|
||||||
|
{
|
||||||
|
this.querybuiler = mapper.QueryBuilder;
|
||||||
|
this.context = mapper.Context;
|
||||||
|
this.sqlBuilder = mapper.SqlBuilder;
|
||||||
|
if (this.querybuiler.TableShortName.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
this.querybuiler.TableShortName = (childExpression as MemberExpression).Expression.ToString();
|
||||||
|
}
|
||||||
|
var type = (childExpression as MemberExpression).Type.GetGenericArguments()[0];
|
||||||
|
this.context.InitMappingInfo(type);
|
||||||
|
return new MapperExpressionInfo()
|
||||||
|
{
|
||||||
|
EntityInfo = this.context.EntityMaintenance.GetEntityInfo(type)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
private MapperExpressionInfo GetMappingFild1ManyInfo(Expression childExpression, MapperExpression mapper)
|
||||||
|
{
|
||||||
|
var exp = mapper.MappingField1Expression;
|
||||||
|
var field = (exp as LambdaExpression).Body;
|
||||||
|
if (field is UnaryExpression)
|
||||||
|
{
|
||||||
|
field = (field as UnaryExpression).Operand;
|
||||||
|
}
|
||||||
|
var type = ((field as MemberExpression).Expression).Type;
|
||||||
|
this.context.InitMappingInfo(type);
|
||||||
|
var name = (field as MemberExpression).Member.Name;
|
||||||
|
var entity = this.context.EntityMaintenance.GetEntityInfo(type);
|
||||||
|
var fieldName = entity.Columns.First(it => it.PropertyName == name).DbColumnName;
|
||||||
|
//var array = (field as MemberExpression).ToString().Split('.').ToList();
|
||||||
|
//array[array.Count() - 1] = fieldName;
|
||||||
|
//var filedString = string.Join(".", array);
|
||||||
|
return new MapperExpressionInfo()
|
||||||
|
{
|
||||||
|
Type = type,
|
||||||
|
FieldName = fieldName,
|
||||||
|
FieldString = fieldName,
|
||||||
|
EntityInfo = entity
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
void Error01()
|
void Error01()
|
||||||
{
|
{
|
||||||
Check.Exception(mappers == null, ErrorMessage.GetThrowMessage(expression.ToString() + "no support", "当前表达式" + expression.ToString() + "必须在Mapper之后使用"));
|
Check.Exception(mappers == null, ErrorMessage.GetThrowMessage(expression.ToString() + "no support", "当前表达式" + expression.ToString() + "必须在Mapper之后使用"));
|
||||||
|
@ -154,6 +154,12 @@ namespace SqlSugar
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var constValue = ExpressionTool.DynamicInvoke(express);
|
var constValue = ExpressionTool.DynamicInvoke(express);
|
||||||
|
if (constValue is MapperSql)
|
||||||
|
{
|
||||||
|
constValue = (constValue as MapperSql).Sql;
|
||||||
|
base.AppendValue(parameter, isLeft, constValue);
|
||||||
|
return;
|
||||||
|
}
|
||||||
parameter.BaseParameter.CommonTempData = constValue;
|
parameter.BaseParameter.CommonTempData = constValue;
|
||||||
var parameterName = base.AppendParameter(constValue);
|
var parameterName = base.AppendParameter(constValue);
|
||||||
if (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Result))
|
if (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Result))
|
||||||
|
Loading…
Reference in New Issue
Block a user