修复((datetime?)o.time).value > '2022/1/1'这种表达式
This commit is contained in:
parent
1e19ff3c0c
commit
47fb29bdd6
|
@ -46,7 +46,7 @@ namespace Sample.MySql.Controllers
|
|||
// Console.WriteLine("------------");
|
||||
// using (var tran = _defaultTableDbContext.Database.BeginTransaction())
|
||||
// {
|
||||
var sysUserMods = _defaultTableDbContext.Set<SysUserMod>();
|
||||
var sysUserMods = _defaultTableDbContext.Set<SysUserMod>().OrderBy(o=>o.Id).ThenBy(o=>o.Name);
|
||||
var resultX = await _defaultTableDbContext.Set<SysUserMod>()
|
||||
.Where(o => o.Id == "2" || o.Id == "3").FirstOrDefaultAsync();
|
||||
var resultY = await _defaultTableDbContext.Set<SysUserMod>().FirstOrDefaultAsync(o => o.Id == "2" || o.Id == "3");
|
||||
|
|
|
@ -96,10 +96,18 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
|
|||
/// <param name="builder"></param>
|
||||
public abstract void Configure(EntityMetadataTableBuilder<T> builder);
|
||||
|
||||
/// <summary>
|
||||
/// 创建分页配置
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public virtual IPaginationConfiguration<T> CreatePaginationConfiguration()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
/// <summary>
|
||||
/// 创建熟悉怒查询配置
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public virtual IEntityQueryConfiguration<T> CreateEntityQueryConfiguration()
|
||||
{
|
||||
return null;
|
||||
|
|
|
@ -104,26 +104,45 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
{
|
||||
if (expression is MemberExpression member)
|
||||
{
|
||||
if (member.Expression?.Type == _entityMetadata.EntityType ||
|
||||
MemberExpressionIsConvertAndOriginalIsEntityType(member))
|
||||
MemberExpression realMember = null;
|
||||
if (member.Expression?.Type == _entityMetadata.EntityType)
|
||||
{
|
||||
realMember = member;
|
||||
}
|
||||
else if (MemberExpressionIsConvertAndOriginalIsEntityType(member,out realMember))
|
||||
{
|
||||
}
|
||||
|
||||
if (realMember != null)
|
||||
{
|
||||
var isShardingKey = false;
|
||||
if (_shardingTableRoute)
|
||||
{
|
||||
isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(member.Member.Name);
|
||||
isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(realMember.Member.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(member.Member.Name);
|
||||
isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(realMember.Member.Name);
|
||||
}
|
||||
|
||||
if (isShardingKey)
|
||||
{
|
||||
shardingPredicateResult = new ShardingPredicateResult(true, member.Member.Name);
|
||||
shardingPredicateResult = new ShardingPredicateResult(true, realMember.Member.Name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// else if (expression is BinaryExpression binaryExpression)
|
||||
// {
|
||||
// if (IsShardingKey(binaryExpression.Left, out shardingPredicateResult))
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
// else if (IsShardingKey(binaryExpression.Right, out shardingPredicateResult))
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
|
||||
shardingPredicateResult = _noShardingPredicateResult;
|
||||
return false;
|
||||
|
@ -133,12 +152,30 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
/// 成员表达式是强转并且强转前的类型是当前对象
|
||||
/// </summary>
|
||||
/// <param name="member"></param>
|
||||
/// <param name="realMember"></param>
|
||||
/// <returns></returns>
|
||||
private bool MemberExpressionIsConvertAndOriginalIsEntityType(MemberExpression member)
|
||||
private bool MemberExpressionIsConvertAndOriginalIsEntityType(MemberExpression member,
|
||||
out MemberExpression realMember)
|
||||
{
|
||||
return member.Expression?.NodeType == ExpressionType.Convert &&
|
||||
member.Expression is UnaryExpression unaryExpression &&
|
||||
unaryExpression.Operand.Type == _entityMetadata.EntityType;
|
||||
if (member.Expression?.NodeType == ExpressionType.Convert &&
|
||||
member.Expression is UnaryExpression unaryExpression)
|
||||
{
|
||||
if (unaryExpression.Operand.Type == _entityMetadata.EntityType)
|
||||
{
|
||||
realMember = member;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (unaryExpression.Operand is MemberExpression m &&
|
||||
m.Expression?.Type == _entityMetadata.EntityType)
|
||||
{
|
||||
realMember = m;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
realMember = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
using System.Linq.Expressions;
|
||||
|
||||
namespace ShardingCore.CommonTest;
|
||||
|
||||
public static class QueryableExtension
|
||||
{
|
||||
public static IQueryable<T> CheckBetween<T, S>(this IQueryable<T> baseQuery, S? valMin,S? valMax,Expression<Func<T,S?>> field,bool includeMin=true,bool includeMax=true) where S : struct
|
||||
{
|
||||
|
||||
if (valMin == null && valMax == null)
|
||||
{
|
||||
return baseQuery;
|
||||
}
|
||||
else
|
||||
{
|
||||
IQueryable<T> rv = baseQuery;
|
||||
if (valMin != null)
|
||||
{
|
||||
BinaryExpression exp1 = !includeMin ? Expression.GreaterThan(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMin)) : Expression.GreaterThanOrEqual(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMin));
|
||||
rv = rv.Where(Expression.Lambda<Func<T, bool>>(exp1, field.Parameters[0]));
|
||||
}
|
||||
if (valMax != null)
|
||||
{
|
||||
BinaryExpression exp2 = !includeMax ? Expression.LessThan(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMax)) : Expression.LessThanOrEqual(Expression.PropertyOrField(field.Body, "Value"), Expression.Constant(valMax));
|
||||
rv = rv.Where(Expression.Lambda<Func<T, bool>>(exp2, field.Parameters[0]));
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -9,6 +9,7 @@ using Xunit;
|
|||
namespace ShardingCore.CommonTest
|
||||
{
|
||||
|
||||
|
||||
public class ShardingTableTime
|
||||
{
|
||||
private readonly EntityMetadata _testEntityMetadata;
|
||||
|
@ -95,7 +96,7 @@ namespace ShardingCore.CommonTest
|
|||
var obj1 = new {time=new DateTime(2022, 1, 2)};
|
||||
var queryables=new List<IQueryable<TestTimeEntity>>()
|
||||
{
|
||||
|
||||
new List<TestTimeEntity>().AsQueryable().CheckBetween((DateTime?)queryTime,(DateTime?)queryTime3,o=>o.Time),
|
||||
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time==times2[0]),
|
||||
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time>=times2[0]&&o.Time<times2[1]),
|
||||
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time>=queryTime&&o.Time<queryTime2),
|
||||
|
|
Loading…
Reference in New Issue