修复((datetime?)o.time).value > '2022/1/1'这种表达式

This commit is contained in:
xuejiaming 2022-08-03 23:12:47 +08:00
parent 1e19ff3c0c
commit 47fb29bdd6
5 changed files with 87 additions and 11 deletions

View File

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

View File

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

View File

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

View File

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

View File

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