mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 增加 FreeSql.Extensions.Linq ThenBy/ThenByDescending 扩展方法 #380;
This commit is contained in:
		@@ -47,5 +47,15 @@
 | 
				
			|||||||
            【linq to sql】专用扩展方法,不建议直接使用
 | 
					            【linq to sql】专用扩展方法,不建议直接使用
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSqlExtensionsLinqSql.ThenBy``2(FreeSql.ISelect{``0},System.Linq.Expressions.Expression{System.Func{``0,``1}})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            【linq to sql】专用扩展方法,不建议直接使用
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSqlExtensionsLinqSql.ThenByDescending``2(FreeSql.ISelect{``0},System.Linq.Expressions.Expression{System.Func{``0,``1}})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            【linq to sql】专用扩展方法,不建议直接使用
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,4 +141,13 @@ public static class FreeSqlExtensionsLinqSql
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return that;
 | 
					        return that;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// 【linq to sql】专用扩展方法,不建议直接使用
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    public static ISelect<T1> ThenBy<T1, TMember>(this ISelect<T1> that, Expression<Func<T1, TMember>> column) where T1 : class => that.OrderBy(column);
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// 【linq to sql】专用扩展方法,不建议直接使用
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    public static ISelect<T1> ThenByDescending<T1, TMember>(this ISelect<T1> that, Expression<Func<T1, TMember>> column) where T1 : class => that.OrderByDescending(column);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,13 +125,6 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            根据 lambda 条件删除数据
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="predicate"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
@@ -486,14 +479,5 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            批量注入 Repository,可以参考代码自行调整
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="services"></param>
 | 
					 | 
				
			||||||
            <param name="globalDataFilter"></param>
 | 
					 | 
				
			||||||
            <param name="assemblies"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,6 +43,63 @@ namespace FreeSql.Tests.Linq
 | 
				
			|||||||
            Assert.Equal(item.id, t1[0].id);
 | 
					            Assert.Equal(item.id, t1[0].id);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void OrderBy()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = new TestLinqToSql { name = Guid.NewGuid().ToString() };
 | 
				
			||||||
 | 
					            g.sqlite.Insert<TestLinqToSql>().AppendData(item).ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t1 = (from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                      where a.id == item.id
 | 
				
			||||||
 | 
					                      orderby a.id
 | 
				
			||||||
 | 
					                      select a).ToList();
 | 
				
			||||||
 | 
					            Assert.True(t1.Any());
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, t1[0].id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal((from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                          where a.id == item.id
 | 
				
			||||||
 | 
					                          orderby a.id
 | 
				
			||||||
 | 
					                          select a).ToSql(),
 | 
				
			||||||
 | 
					                          (from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                           where a.id == item.id
 | 
				
			||||||
 | 
					                           orderby a.id ascending
 | 
				
			||||||
 | 
					                           select a).ToSql());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal((from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                          where a.id == item.id
 | 
				
			||||||
 | 
					                          orderby a.id ascending
 | 
				
			||||||
 | 
					                          select a).ToSql(),
 | 
				
			||||||
 | 
					                          g.sqlite.Select<TestLinqToSql>().Where(a => a.id == item.id).OrderBy(a => a.id).ToSql());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal((from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                          where a.id == item.id
 | 
				
			||||||
 | 
					                          orderby a.id descending
 | 
				
			||||||
 | 
					                          select a).ToSql(),
 | 
				
			||||||
 | 
					                          g.sqlite.Select<TestLinqToSql>().Where(a => a.id == item.id).OrderByDescending(a => a.id).ToSql());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal((from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                          where a.id == item.id
 | 
				
			||||||
 | 
					                          orderby a.id, a.createtime ascending, a.name descending
 | 
				
			||||||
 | 
					                          select a).ToSql(),
 | 
				
			||||||
 | 
					                          (from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                           where a.id == item.id
 | 
				
			||||||
 | 
					                           orderby a.id, a.createtime, a.name descending
 | 
				
			||||||
 | 
					                           select a).ToSql());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal((from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                          where a.id == item.id
 | 
				
			||||||
 | 
					                          orderby a.id ascending, a.createtime ascending, a.name descending
 | 
				
			||||||
 | 
					                          select a).ToSql(),
 | 
				
			||||||
 | 
					                          g.sqlite.Select<TestLinqToSql>().Where(a => a.id == item.id).OrderBy(a => a.id).OrderBy(a => a.createtime).OrderByDescending(a => a.name).ToSql());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal((from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
 | 
					                          where a.id == item.id
 | 
				
			||||||
 | 
					                          orderby a.id descending, a.createtime ascending, a.name descending
 | 
				
			||||||
 | 
					                          select a).ToSql(),
 | 
				
			||||||
 | 
					                          g.sqlite.Select<TestLinqToSql>().Where(a => a.id == item.id).OrderByDescending(a => a.id).OrderBy(a => a.createtime).OrderByDescending(a => a.name).ToSql());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Select()
 | 
					        public void Select()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -111,6 +168,7 @@ namespace FreeSql.Tests.Linq
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            var t1 = (from a in g.sqlite.Select<TestLinqToSql>()
 | 
					            var t1 = (from a in g.sqlite.Select<TestLinqToSql>()
 | 
				
			||||||
                      join b in g.sqlite.Select<TestLinqToSqlComment>() on a.id equals b.TestLinqToSqlId
 | 
					                      join b in g.sqlite.Select<TestLinqToSqlComment>() on a.id equals b.TestLinqToSqlId
 | 
				
			||||||
 | 
					                      orderby b.id descending
 | 
				
			||||||
                      select a).ToList();
 | 
					                      select a).ToList();
 | 
				
			||||||
            Assert.True(t1.Any());
 | 
					            Assert.True(t1.Any());
 | 
				
			||||||
            //Assert.Equal(item.id, t1[0].id);
 | 
					            //Assert.Equal(item.id, t1[0].id);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1320,19 +1320,29 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                //判断 [JsonMap] 并非导航对象,所以在上面提前判断 ColumnsByCs
 | 
					                                //判断 [JsonMap] 并非导航对象,所以在上面提前判断 ColumnsByCs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                var tb2tmp = _common.GetTableByEntity(exp2Type);
 | 
					                                var tb2tmp = _common.GetTableByEntity(exp2Type);
 | 
				
			||||||
 | 
					                                var exp2IsParameter = false;
 | 
				
			||||||
                                if (tb2tmp != null)
 | 
					                                if (tb2tmp != null)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    if (exp2.NodeType == ExpressionType.Parameter)
 | 
					                                    if (exp2.NodeType == ExpressionType.Parameter)
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
                                        parmExp2 = (exp2 as ParameterExpression);
 | 
					                                        parmExp2 = (exp2 as ParameterExpression);
 | 
				
			||||||
                                        alias2 = parmExp2.Name;
 | 
					                                        alias2 = parmExp2.Name;
 | 
				
			||||||
 | 
					                                        exp2IsParameter = true;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                    else alias2 = $"{alias2}__{mp2.Member.Name}";
 | 
					                                    else if (string.IsNullOrEmpty(alias2) && exp2 is MemberExpression expMem && (
 | 
				
			||||||
                                    find2 = getOrAddTable(tb2tmp, alias2, exp2.NodeType == ExpressionType.Parameter, parmExp2, mp2);
 | 
					                                        _common.GetTableByEntity(expMem.Expression.Type)?.ColumnsByCs.ContainsKey(expMem.Member.Name) == false ||
 | 
				
			||||||
 | 
					                                        expMem.Expression.NodeType == ExpressionType.Parameter && expMem.Expression.Type.IsAnonymousType())) //<>h__TransparentIdentifier 是 Linq To Sql 的类型判断,此时为匿名类型
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        alias2 = mp2.Member.Name;
 | 
				
			||||||
 | 
					                                        exp2IsParameter = true;
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                    else
 | 
				
			||||||
 | 
					                                        alias2 = $"{alias2}__{mp2.Member.Name}";
 | 
				
			||||||
 | 
					                                    find2 = getOrAddTable(tb2tmp, alias2, exp2IsParameter, parmExp2, mp2);
 | 
				
			||||||
                                    alias2 = find2.Alias;
 | 
					                                    alias2 = find2.Alias;
 | 
				
			||||||
                                    tb2 = tb2tmp;
 | 
					                                    tb2 = tb2tmp;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                if (exp2.NodeType == ExpressionType.Parameter && expStack.Any() == false)
 | 
					                                if (exp2IsParameter && expStack.Any() == false)
 | 
				
			||||||
                                { //附加选择的参数所有列
 | 
					                                { //附加选择的参数所有列
 | 
				
			||||||
                                    if (tsc._selectColumnMap != null)
 | 
					                                    if (tsc._selectColumnMap != null)
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
@@ -1349,7 +1359,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                        var tb3 = _common.GetTableByEntity(mp2.Type);
 | 
					                                        var tb3 = _common.GetTableByEntity(mp2.Type);
 | 
				
			||||||
                                        if (tb3 != null)
 | 
					                                        if (tb3 != null)
 | 
				
			||||||
                                        {
 | 
					                                        {
 | 
				
			||||||
                                            var find3 = getOrAddTable(tb2tmp, alias2 /*$"{alias2}__{mp2.Member.Name}"*/, exp2.NodeType == ExpressionType.Parameter, parmExp2, mp2);
 | 
					                                            var find3 = getOrAddTable(tb2tmp, alias2 /*$"{alias2}__{mp2.Member.Name}"*/, exp2IsParameter, parmExp2, mp2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                            foreach (var tb3c in tb3.Columns.Values)
 | 
					                                            foreach (var tb3c in tb3.Columns.Values)
 | 
				
			||||||
                                                tsc._selectColumnMap.Add(new SelectColumnInfo { Table = find3, Column = tb3c });
 | 
					                                                tsc._selectColumnMap.Add(new SelectColumnInfo { Table = find3, Column = tb3c });
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user