mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-08-23 22:11:36 +08:00
Update exp to sql
This commit is contained in:
parent
8c44ce9dd3
commit
c4ea537902
@ -99,6 +99,7 @@
|
|||||||
<Compile Include="UnitTest\Models\TestModel.cs" />
|
<Compile Include="UnitTest\Models\TestModel.cs" />
|
||||||
<Compile Include="UnitTest\Models\UserEntity.cs" />
|
<Compile Include="UnitTest\Models\UserEntity.cs" />
|
||||||
<Compile Include="UnitTest\Models\UserRoleEntity.cs" />
|
<Compile Include="UnitTest\Models\UserRoleEntity.cs" />
|
||||||
|
<Compile Include="UnitTest\UCustom017.cs" />
|
||||||
<Compile Include="UnitTest\UCustom016.cs" />
|
<Compile Include="UnitTest\UCustom016.cs" />
|
||||||
<Compile Include="UnitTest\UCustom015.cs" />
|
<Compile Include="UnitTest\UCustom015.cs" />
|
||||||
<Compile Include="UnitTest\UCustom014.cs" />
|
<Compile Include="UnitTest\UCustom014.cs" />
|
||||||
|
@ -31,6 +31,7 @@ namespace OrmTest
|
|||||||
}
|
}
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
|
UCustom017.Init();
|
||||||
UCustom016.Init();
|
UCustom016.Init();
|
||||||
UCustom015.Init();
|
UCustom015.Init();
|
||||||
UCustom014.Init();
|
UCustom014.Init();
|
||||||
|
24
Src/Asp.Net/SqlServerTest/UnitTest/UCustom017.cs
Normal file
24
Src/Asp.Net/SqlServerTest/UnitTest/UCustom017.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using OrmTest.UnitTest.Models;
|
||||||
|
using SqlSugar;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace OrmTest
|
||||||
|
{
|
||||||
|
public class UCustom017
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
var db = NewUnitTest.Db;
|
||||||
|
db.Queryable<Order>()
|
||||||
|
.Where(it => it.Id==SqlFunc.Subqueryable<Order>().Where(z=>z.Id==it.Id).GroupBy(z=>z.Id).Select(x=>x.Id) )
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,8 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace SqlSugar
|
namespace SqlSugar
|
||||||
{
|
{
|
||||||
public class BinaryExpressionResolve : BaseResolve
|
public class BinaryExpressionResolve : BaseResolve
|
||||||
@ -26,6 +28,13 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
var expression = this.Expression as BinaryExpression;
|
var expression = this.Expression as BinaryExpression;
|
||||||
var operatorValue = parameter.OperatorValue = ExpressionTool.GetOperator(expression.NodeType);
|
var operatorValue = parameter.OperatorValue = ExpressionTool.GetOperator(expression.NodeType);
|
||||||
|
|
||||||
|
if (IsGroupSubquery(expression.Right,operatorValue))
|
||||||
|
{
|
||||||
|
InSubGroupBy(expression);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var isEqual = expression.NodeType == ExpressionType.Equal;
|
var isEqual = expression.NodeType == ExpressionType.Equal;
|
||||||
var isComparisonOperator = ExpressionTool.IsComparisonOperator(expression);
|
var isComparisonOperator = ExpressionTool.IsComparisonOperator(expression);
|
||||||
base.ExactExpression = expression;
|
base.ExactExpression = expression;
|
||||||
@ -88,5 +97,56 @@ namespace SqlSugar
|
|||||||
base.Context.Result.Append(" " + ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index + " ");
|
base.Context.Result.Append(" " + ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index + " ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void InSubGroupBy(BinaryExpression expression)
|
||||||
|
{
|
||||||
|
var leftSql = GetNewExpressionValue(expression.Left);
|
||||||
|
var rightExpression = expression.Right as MethodCallExpression;
|
||||||
|
var selector = GetNewExpressionValue(rightExpression.Arguments[0]);
|
||||||
|
var rightSql = GetNewExpressionValue(rightExpression.Object).Replace("SELECT FROM", $"SELECT {selector} FROM");
|
||||||
|
if (this.Context.IsSingle&&this.Context.SingleTableNameSubqueryShortName==null)
|
||||||
|
{
|
||||||
|
var leftExp = expression.Left;
|
||||||
|
if (leftExp is UnaryExpression)
|
||||||
|
{
|
||||||
|
leftExp = (leftExp as UnaryExpression).Operand;
|
||||||
|
}
|
||||||
|
var p = (leftExp as MemberExpression);
|
||||||
|
this.Context.SingleTableNameSubqueryShortName=p.Expression.ToString();
|
||||||
|
}
|
||||||
|
base.Context.Result.Append($" {leftSql} in ({rightSql}) ");
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsGroupSubquery(Expression rightExpression, string operatorValue)
|
||||||
|
{
|
||||||
|
if (operatorValue != "=")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rightExpression == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((rightExpression is MethodCallExpression) == false)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var method = (rightExpression as MethodCallExpression);
|
||||||
|
if (method.Method.Name != "Select")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var methodString = method.ToString();
|
||||||
|
if (methodString.IndexOf("GroupBy(")==0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (Regex.Matches(methodString, @"Subqueryable\(").Count!=1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user