mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-05-05 13:17:57 +08:00
Navigate query
This commit is contained in:
parent
4d2abd2f32
commit
a955a68ce1
@ -81,8 +81,33 @@ namespace OrmTest
|
||||
db.Insertable(new ABMapping1() { AId =2, BId = 1 }).ExecuteCommand();
|
||||
db.Insertable(new ABMapping1() { AId = 2, BId = 2 }).ExecuteCommand();
|
||||
var list3= db.Queryable<A1>().Includes(x => x.BList).ToList();
|
||||
|
||||
db.CodeFirst.InitTables(typeof(Tree1));
|
||||
db.DbMaintenance.TruncateTable("Tree1");
|
||||
db.Insertable(new Tree1() { Id = 1, Name = "01" }).ExecuteCommand();
|
||||
db.Insertable(new Tree1() { Id = 2, Name = "0101", ParentId = 1 }).ExecuteCommand();
|
||||
db.Insertable(new Tree1() { Id = 3, Name = "0102", ParentId = 1 }).ExecuteCommand();
|
||||
db.Insertable(new Tree1() { Id = 4, Name = "02" }).ExecuteCommand();
|
||||
db.Insertable(new Tree1() { Id = 5, Name = "0201", ParentId = 2 }).ExecuteCommand();
|
||||
db.Insertable(new Tree1() { Id = 6, Name = "020101", ParentId = 22 }).ExecuteCommand();
|
||||
var list4=db.Queryable<Tree1>()
|
||||
.Includes(it => it.Child,it=>it.Child)
|
||||
.Includes(it => it.Parent,it=>it.Parent)
|
||||
.ToList();
|
||||
//var json = db.Utilities.SerializeObject(list4);
|
||||
}
|
||||
|
||||
public class Tree1
|
||||
{
|
||||
[SqlSugar.SugarColumn(IsPrimaryKey = true)]
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public int ParentId { get; set; }
|
||||
[Navigat(NavigatType.OneToOne,nameof(ParentId))]
|
||||
public Tree1 Parent { get; set; }
|
||||
[Navigat(NavigatType.OneToMany,nameof(Tree1.ParentId))]
|
||||
public List<Tree1> Child { get; set; }
|
||||
}
|
||||
public class ABMapping1
|
||||
{
|
||||
[SugarColumn(IsPrimaryKey = true )]
|
||||
|
@ -24,6 +24,7 @@ namespace SqlSugar
|
||||
//public QueryableProvider<T> Queryable { get; set; }
|
||||
|
||||
private List<Expression> _preExpressionList = new List<Expression>();
|
||||
private List<object> _preList = new List<object>();
|
||||
//private Expression[] _expressions;
|
||||
//private List<T> _list;
|
||||
//private EntityInfo _entityInfo;
|
||||
@ -46,10 +47,45 @@ namespace SqlSugar
|
||||
}
|
||||
else if (i == 2)
|
||||
{
|
||||
var currentList = RootList;
|
||||
if (RootList == null || currentList.Count == 0) return;
|
||||
var memberExpression = ((_preExpressionList.Last() as LambdaExpression).Body as MemberExpression);
|
||||
var navObjectName = memberExpression.Member.Name;
|
||||
var list = RootList.Select(it => (it.GetType().GetProperty(navObjectName).GetValue(it))).ToList();
|
||||
var navType = currentList[0].GetType().GetProperty(navObjectName).PropertyType.Name;
|
||||
var isList = navType.StartsWith("List`");
|
||||
List<object> list = new List<object>();
|
||||
if (isList)
|
||||
{
|
||||
list = currentList.SelectMany(it => (it.GetType().GetProperty(navObjectName).GetValue(it) as IList).Cast<object>()).ToList();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
list = currentList.Select(it => (it.GetType().GetProperty(navObjectName).GetValue(it))).ToList();
|
||||
}
|
||||
ExecuteByLay(item, list, SelectR2);
|
||||
_preList = list;
|
||||
}
|
||||
else if (i == 3)
|
||||
{
|
||||
var currentList = _preList;
|
||||
if (RootList == null || currentList.Count == 0) return;
|
||||
var memberExpression = ((_preExpressionList.Last() as LambdaExpression).Body as MemberExpression);
|
||||
var navObjectName = memberExpression.Member.Name;
|
||||
var navType = currentList[0].GetType().GetProperty(navObjectName).PropertyType.Name;
|
||||
var isList = navType.StartsWith("List`");
|
||||
List<object> list = new List<object>();
|
||||
if (isList)
|
||||
{
|
||||
list = currentList.SelectMany(it => (it.GetType().GetProperty(navObjectName).GetValue(it) as IList).Cast<object>()).ToList();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
list = currentList.Select(it => (it.GetType().GetProperty(navObjectName).GetValue(it))).ToList();
|
||||
}
|
||||
ExecuteByLay(item, list, SelectR3);
|
||||
_preList = list;
|
||||
}
|
||||
_preExpressionList.Add(item);
|
||||
}
|
||||
@ -57,9 +93,16 @@ namespace SqlSugar
|
||||
private void ExecuteByLay(Expression expression, List<object> list, Func<ISugarQueryable<object>, List<object>> selector)
|
||||
{
|
||||
if (list == null || list.Count == 0) return;
|
||||
list = list.Where(it => it != null).ToList();
|
||||
var memberExpression = ((expression as LambdaExpression).Body as MemberExpression);
|
||||
|
||||
var listItemType = list[0].GetType();
|
||||
var listItemType = list.Where(it=>it!=null).FirstOrDefault()?.GetType();
|
||||
if (listItemType.Name.StartsWith("List`"))
|
||||
{
|
||||
listItemType = listItemType.GetGenericArguments()[0];
|
||||
}
|
||||
if (listItemType == null) return;
|
||||
|
||||
var listItemEntity = this.Context.EntityMaintenance.GetEntityInfo(listItemType);
|
||||
var listPkColumn = listItemEntity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault();
|
||||
var navObjectName = memberExpression.Member.Name;
|
||||
|
Loading…
Reference in New Issue
Block a user