diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.xml b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.xml index f5004a0a..0b221156 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.xml +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.xml @@ -47,5 +47,15 @@ 【linq to sql】专用扩展方法,不建议直接使用 + + + 【linq to sql】专用扩展方法,不建议直接使用 + + + + + 【linq to sql】专用扩展方法,不建议直接使用 + + diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSqlExtensionsLinq.cs b/Extensions/FreeSql.Extensions.Linq/FreeSqlExtensionsLinq.cs index 5df25a29..92d9aefa 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSqlExtensionsLinq.cs +++ b/Extensions/FreeSql.Extensions.Linq/FreeSqlExtensionsLinq.cs @@ -141,4 +141,13 @@ public static class FreeSqlExtensionsLinqSql { return that; } + + /// + /// 【linq to sql】专用扩展方法,不建议直接使用 + /// + public static ISelect ThenBy(this ISelect that, Expression> column) where T1 : class => that.OrderBy(column); + /// + /// 【linq to sql】专用扩展方法,不建议直接使用 + /// + public static ISelect ThenByDescending(this ISelect that, Expression> column) where T1 : class => that.OrderByDescending(column); } diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 4854f49c..132d875e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -125,13 +125,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 @@ -486,14 +479,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/Linq/ISelectLinqToSqlTests.cs b/FreeSql.Tests/FreeSql.Tests/Linq/ISelectLinqToSqlTests.cs index 584b94c3..6caafb05 100644 --- a/FreeSql.Tests/FreeSql.Tests/Linq/ISelectLinqToSqlTests.cs +++ b/FreeSql.Tests/FreeSql.Tests/Linq/ISelectLinqToSqlTests.cs @@ -43,6 +43,63 @@ namespace FreeSql.Tests.Linq Assert.Equal(item.id, t1[0].id); } + [Fact] + public void OrderBy() + { + var item = new TestLinqToSql { name = Guid.NewGuid().ToString() }; + g.sqlite.Insert().AppendData(item).ExecuteAffrows(); + + var t1 = (from a in g.sqlite.Select() + 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() + where a.id == item.id + orderby a.id + select a).ToSql(), + (from a in g.sqlite.Select() + where a.id == item.id + orderby a.id ascending + select a).ToSql()); + + Assert.Equal((from a in g.sqlite.Select() + where a.id == item.id + orderby a.id ascending + select a).ToSql(), + g.sqlite.Select().Where(a => a.id == item.id).OrderBy(a => a.id).ToSql()); + + Assert.Equal((from a in g.sqlite.Select() + where a.id == item.id + orderby a.id descending + select a).ToSql(), + g.sqlite.Select().Where(a => a.id == item.id).OrderByDescending(a => a.id).ToSql()); + + + Assert.Equal((from a in g.sqlite.Select() + where a.id == item.id + orderby a.id, a.createtime ascending, a.name descending + select a).ToSql(), + (from a in g.sqlite.Select() + where a.id == item.id + orderby a.id, a.createtime, a.name descending + select a).ToSql()); + + Assert.Equal((from a in g.sqlite.Select() + where a.id == item.id + orderby a.id ascending, a.createtime ascending, a.name descending + select a).ToSql(), + g.sqlite.Select().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() + where a.id == item.id + orderby a.id descending, a.createtime ascending, a.name descending + select a).ToSql(), + g.sqlite.Select().Where(a => a.id == item.id).OrderByDescending(a => a.id).OrderBy(a => a.createtime).OrderByDescending(a => a.name).ToSql()); + } + [Fact] public void Select() { @@ -111,6 +168,7 @@ namespace FreeSql.Tests.Linq var t1 = (from a in g.sqlite.Select() join b in g.sqlite.Select() on a.id equals b.TestLinqToSqlId + orderby b.id descending select a).ToList(); Assert.True(t1.Any()); //Assert.Equal(item.id, t1[0].id); diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 6a8cda46..d85749c3 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1320,19 +1320,29 @@ namespace FreeSql.Internal //判断 [JsonMap] 并非导航对象,所以在上面提前判断 ColumnsByCs var tb2tmp = _common.GetTableByEntity(exp2Type); + var exp2IsParameter = false; if (tb2tmp != null) { if (exp2.NodeType == ExpressionType.Parameter) { parmExp2 = (exp2 as ParameterExpression); alias2 = parmExp2.Name; + exp2IsParameter = true; } - else alias2 = $"{alias2}__{mp2.Member.Name}"; - find2 = getOrAddTable(tb2tmp, alias2, exp2.NodeType == ExpressionType.Parameter, parmExp2, mp2); + else if (string.IsNullOrEmpty(alias2) && exp2 is MemberExpression expMem && ( + _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; tb2 = tb2tmp; } - if (exp2.NodeType == ExpressionType.Parameter && expStack.Any() == false) + if (exp2IsParameter && expStack.Any() == false) { //附加选择的参数所有列 if (tsc._selectColumnMap != null) { @@ -1349,7 +1359,7 @@ namespace FreeSql.Internal var tb3 = _common.GetTableByEntity(mp2.Type); 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) tsc._selectColumnMap.Add(new SelectColumnInfo { Table = find3, Column = tb3c });