- 优化 导航集合属性访问,可省略 AsSelect;#15 #300 #362 #509 #698 #644 #903

This commit is contained in:
2881099
2022-04-27 20:27:24 +08:00
parent dcf7b9668f
commit f76a46f383
20 changed files with 1947 additions and 346 deletions

View File

@ -23,7 +23,7 @@ using System.Threading.Tasks;
namespace base_entity
{
class Program
static class Program
{
class TestConfig
{
@ -196,6 +196,17 @@ namespace base_entity
fsql.UseJsonMap();
//var txt1 = fsql.Ado.Query<(string, string)>("select '꧁꫞꯭丑小鸭꫞꧂', '123123中国人' from dual");
fsql.Insert(new Order { ShippingAddress = "'꧁꫞꯭丑小鸭꫞꧂'" }).ExecuteAffrows();
fsql.Insert(new Order { ShippingAddress = "'123123中国人'" }).ExecuteAffrows();
var lst1 = fsql.Select<Order>().ToList();
var lst2 = fsql.Select<Order>().ToListIgnore(a => new
{
a.ShippingAddress
});
fsql.Delete<TopicMapTypeToListDto>().Where("1=1").ExecuteAffrows();
fsql.Insert(new[]
{
@ -794,5 +805,48 @@ namespace base_entity
Console.WriteLine("按任意键结束。。。");
Console.ReadKey();
}
public static List<T1> ToListIgnore<T1>(this ISelect<T1> that, Expression<Func<T1, object>> selector)
{
if (selector == null) return that.ToList();
var s0p = that as Select0Provider;
var tb = s0p._tables[0];
var parmExp = tb.Parameter ?? Expression.Parameter(tb.Table.Type, tb.Alias);
var initExps = tb.Table.Columns.Values
.Where(a => a.Attribute.IsIgnore == false)
.Select(a => new
{
exp = Expression.Bind(tb.Table.Properties[a.CsName], Expression.MakeMemberAccess(parmExp, tb.Table.Properties[a.CsName])),
ignored = TestMemberExpressionVisitor.IsExists(selector, Expression.MakeMemberAccess(parmExp, tb.Table.Properties[a.CsName]))
})
.Where(a => a.ignored == false)
.Select(a => a.exp)
.ToArray();
var lambda = Expression.Lambda<Func<T1, T1>>(
Expression.MemberInit(
Expression.New(tb.Table.Type),
initExps
),
parmExp
);
return that.ToList(lambda);
}
class TestMemberExpressionVisitor : ExpressionVisitor
{
public string MemberExpString;
public bool Result { get; private set; }
public static bool IsExists(Expression selector, Expression memberExp)
{
var visitor = new TestMemberExpressionVisitor { MemberExpString = memberExp.ToString() };
visitor.Visit(selector);
return visitor.Result;
}
protected override Expression VisitMember(MemberExpression node)
{
if (!Result && node.ToString() == MemberExpString) Result = true;
return node;
}
}
}
}

View File

@ -0,0 +1,8 @@
{
"profiles": {
"WSL": {
"commandName": "WSL2",
"distributionName": ""
}
}
}