From e616f8e4a6cd6deee9fc52face4d7cb3e93695e8 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Fri, 17 Jul 2020 18:20:06 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20FreeSql.Extensions.Lin?=
=?UTF-8?q?q=20ThenBy/ThenByDescending=20=E6=89=A9=E5=B1=95=E6=96=B9?=
=?UTF-8?q?=E6=B3=95=20#380=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FreeSql.Extensions.Linq.xml | 10 ++++
.../FreeSqlExtensionsLinq.cs | 9 +++
FreeSql.DbContext/FreeSql.DbContext.xml | 16 -----
.../Linq/ISelectLinqToSqlTests.cs | 58 +++++++++++++++++++
FreeSql/Internal/CommonExpression.cs | 18 ++++--
5 files changed, 91 insertions(+), 20 deletions(-)
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 });