- 增加 FreeSql.Extensions.Linq ThenBy/ThenByDescending 扩展方法 #380;

This commit is contained in:
28810 2020-07-17 18:20:06 +08:00
parent a67e6a8cb5
commit e616f8e4a6
5 changed files with 91 additions and 20 deletions

View File

@ -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>

View File

@ -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);
} }

View File

@ -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>

View File

@ -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);

View File

@ -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 });