- 增加 "x1".First/FirstOrDefault 表达式函数解析;

This commit is contained in:
28810 2020-07-31 02:28:37 +08:00
parent f63a69c55c
commit af153295f8
33 changed files with 364 additions and 1 deletions

View File

@ -52,6 +52,19 @@ namespace FreeSql.Tests.MySqlConnectorExpression
list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.Odbc.DamengExpression
list.Add(g.dameng.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.Odbc.DefaultExpression
list.Add(g.odbc.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Empty()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.Odbc.KingbaseESExpression
list.Add(g.kingbaseES.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -52,6 +52,19 @@ namespace FreeSql.Tests.Odbc.MySqlExpression
list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.Odbc.OracleExpression
list.Add(g.oracle.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.Odbc.PostgreSQLExpression
list.Add(g.pgsql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -51,6 +51,19 @@ namespace FreeSql.Tests.Odbc.SqlServerExpression
list.Add(g.sqlserver.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.DamengExpression
list.Add(g.dameng.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -42,7 +42,7 @@ namespace FreeSql.Tests.DataContext.SqlServer
"TestTypeParentInfo23123", "xxdkdkdk1222", "xxx"};
foreach (var tempTable in tempTables)
{
DeleteTmpTable(dataTables, tempTable);
//DeleteTmpTable(dataTables, tempTable);
}
}

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.MsAccessExpression
list.Add(g.msaccess.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -52,6 +52,19 @@ namespace FreeSql.Tests.MySqlExpression
list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.OracleExpression
list.Add(g.oracle.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.PostgreSQLExpression
list.Add(g.pgsql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.ShenTongExpression
list.Add(g.shentong.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -1,5 +1,6 @@
using FreeSql.DataAnnotations;
using FreeSql.Tests.DataContext.SqlServer;
using Microsoft.EntityFrameworkCore.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
@ -65,6 +66,19 @@ namespace FreeSql.Tests.SqlServerExpression
list.Add(select.Where(a => a.TitleVarchar == "aaa").ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -50,6 +50,19 @@ namespace FreeSql.Tests.SqliteExpression
list.Add(g.sqlite.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
}
[Fact]
public void First()
{
Assert.Equal('x', select.First(a => "x1".First()));
Assert.Equal('z', select.First(a => "z1".First()));
}
[Fact]
public void FirstOrDefault()
{
Assert.Equal('x', select.First(a => "x1".FirstOrDefault()));
Assert.Equal('z', select.First(a => "z1".FirstOrDefault()));
}
[Fact]
public void Format()
{

View File

@ -41,6 +41,7 @@ namespace FreeSql.Internal
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
if (parent.CsType == null) parent.CsType = exp.Type;
return false;
case ExpressionType.Convert: return ReadAnonymousField(_tables, field, parent, ref index, (exp as UnaryExpression)?.Operand, getSelectGroupingMapString, whereCascadeExpression, isAllDtoMap);
case ExpressionType.Constant:
@ -60,6 +61,7 @@ namespace FreeSql.Internal
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
if (parent.CsType == null) parent.CsType = exp.Type;
return false;
case ExpressionType.Call:
var callExp = exp as MethodCallExpression;
@ -77,6 +79,7 @@ namespace FreeSql.Internal
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
if (parent.CsType == null) parent.CsType = exp.Type;
return false;
case ExpressionType.Parameter:
case ExpressionType.MemberAccess:
@ -262,6 +265,7 @@ namespace FreeSql.Internal
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
if (parent.CsType == null) parent.CsType = exp.Type;
return false;
}
public object ReadAnonymous(ReadAnonymousTypeInfo parent, DbDataReader dr, ref int index, bool notRead, ReadAnonymousDbValueRef dbValue)

View File

@ -100,6 +100,16 @@ namespace FreeSql.Dameng
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -70,6 +70,16 @@ namespace FreeSql.MsAccess
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"left({getExp(callExp.Arguments[0])}, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -98,6 +98,16 @@ namespace FreeSql.MySql
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -100,6 +100,16 @@ namespace FreeSql.Odbc.Dameng
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -104,6 +104,16 @@ namespace FreeSql.Odbc.Default
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return _utils.Adapter.LambdaString_Substring(getExp(callExp.Arguments[0]), "1", "1");
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -101,6 +101,16 @@ namespace FreeSql.Odbc.KingbaseES
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -96,6 +96,16 @@ namespace FreeSql.Odbc.MySql
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -100,6 +100,16 @@ namespace FreeSql.Odbc.Oracle
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -101,6 +101,16 @@ namespace FreeSql.Odbc.PostgreSQL
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -106,6 +106,16 @@ namespace FreeSql.Odbc.SqlServer
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -100,6 +100,16 @@ namespace FreeSql.Oracle
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -102,6 +102,16 @@ namespace FreeSql.PostgreSQL
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -101,6 +101,16 @@ namespace FreeSql.ShenTong
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -105,6 +105,16 @@ namespace FreeSql.SqlServer
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substring({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())

View File

@ -96,6 +96,16 @@ namespace FreeSql.Sqlite
objExp = callExp.Arguments.FirstOrDefault();
objType = objExp?.Type;
argIndex++;
if (objType == typeof(string))
{
switch (callExp.Method.Name)
{
case "First":
case "FirstOrDefault":
return $"substr({getExp(callExp.Arguments[0])}, 1, 1)";
}
}
}
if (objType == null) objType = callExp.Method.DeclaringType;
if (objType != null || objType.IsArrayOrList())