[#82]添加多字段辅助分库分片v1

This commit is contained in:
xuejiaming 2021-12-23 22:47:52 +08:00
parent 6f3ce998e4
commit c03e679901
44 changed files with 618 additions and 263 deletions

View File

@ -51,7 +51,7 @@ namespace Sample.SqlServer.Shardings
return $"{dateOfMonth:yyyyMM}"; return $"{dateOfMonth:yyyyMM}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -30,7 +30,7 @@ namespace Sample.SqlServer.Shardings
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToTail(shardingKey); var t = ShardingKeyToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingAll.VirtualDataSourceRoutes
return true; return true;
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingAll.VirtualDataSourceRoutes
return true; return true;
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingDataSource.VirtualRoutes
return true; return true;
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingDataSource.VirtualRoutes
return true; return true;
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -48,7 +48,7 @@ namespace Sample.SqlServerShardingTable.VirtualRoutes
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
//因为hash路由仅支持等于所以仅仅只需要写等于的情况 //因为hash路由仅支持等于所以仅仅只需要写等于的情况
var t = ShardingKeyToTail(shardingKey); var t = ShardingKeyToTail(shardingKey);

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using ShardingCore.Exceptions; using ShardingCore.Exceptions;
@ -18,6 +19,8 @@ namespace ShardingCore.Core.EntityMetadatas
ShardingDbContextType = shardingDbContextType; ShardingDbContextType = shardingDbContextType;
PrimaryKeyProperties = primaryKeyProperties; PrimaryKeyProperties = primaryKeyProperties;
IsSingleKey= PrimaryKeyProperties.Count == 1; IsSingleKey= PrimaryKeyProperties.Count == 1;
ShardingDataSourceProperties = new Dictionary<string, PropertyInfo>();
ShardingTableProperties = new Dictionary<string, PropertyInfo>();
} }
/// <summary> /// <summary>
/// 分表类型 sharding entity type /// 分表类型 sharding entity type
@ -52,6 +55,10 @@ namespace ShardingCore.Core.EntityMetadatas
/// 分库字段 /// 分库字段
/// </summary> /// </summary>
public PropertyInfo ShardingDataSourceProperty { get; private set; } public PropertyInfo ShardingDataSourceProperty { get; private set; }
/// <summary>
/// 分库所有字段包括 ShardingDataSourceProperty
/// </summary>
public IDictionary<string, PropertyInfo> ShardingDataSourceProperties { get; }
/// <summary> /// <summary>
/// 启动时是否建表 auto create data source when start app /// 启动时是否建表 auto create data source when start app
@ -62,6 +69,10 @@ namespace ShardingCore.Core.EntityMetadatas
/// 分表字段 sharding table property /// 分表字段 sharding table property
/// </summary> /// </summary>
public PropertyInfo ShardingTableProperty { get; private set; } public PropertyInfo ShardingTableProperty { get; private set; }
/// <summary>
/// 分表所有字段包括 ShardingTableProperty
/// </summary>
public IDictionary<string, PropertyInfo> ShardingTableProperties { get;}
/// <summary> /// <summary>
@ -80,8 +91,21 @@ namespace ShardingCore.Core.EntityMetadatas
public void SetShardingDataSourceProperty(PropertyInfo propertyInfo) public void SetShardingDataSourceProperty(PropertyInfo propertyInfo)
{ {
Check.NotNull(propertyInfo, nameof(propertyInfo)); Check.NotNull(propertyInfo, nameof(propertyInfo));
Check.ShouldNull(ShardingDataSourceProperty, nameof(ShardingDataSourceProperty)); if (ShardingDataSourceProperties.ContainsKey(propertyInfo.Name))
throw new ShardingCoreConfigException($"same sharding data source property name:[{propertyInfo.Name}] don't repeat add");
ShardingDataSourceProperty = propertyInfo; ShardingDataSourceProperty = propertyInfo;
ShardingDataSourceProperties.Add(propertyInfo.Name, propertyInfo);
}
/// <summary>
/// 添加额外分表字段
/// </summary>
/// <param name="propertyInfo"></param>
/// <exception cref="ShardingCoreConfigException"></exception>
public void AddExtraSharingDataSourceProperty(PropertyInfo propertyInfo)
{
if (ShardingDataSourceProperties.ContainsKey(propertyInfo.Name))
throw new ShardingCoreConfigException($"same sharding data source property name:[{propertyInfo.Name}] don't repeat add");
ShardingDataSourceProperties.Add(propertyInfo.Name, propertyInfo);
} }
/// <summary> /// <summary>
/// 设置分表字段 /// 设置分表字段
@ -90,7 +114,21 @@ namespace ShardingCore.Core.EntityMetadatas
public void SetShardingTableProperty(PropertyInfo propertyInfo) public void SetShardingTableProperty(PropertyInfo propertyInfo)
{ {
Check.NotNull(propertyInfo, nameof(propertyInfo)); Check.NotNull(propertyInfo, nameof(propertyInfo));
if (ShardingTableProperties.ContainsKey(propertyInfo.Name))
throw new ShardingCoreConfigException($"same sharding table property name:[{propertyInfo.Name}] don't repeat add");
ShardingTableProperty = propertyInfo; ShardingTableProperty = propertyInfo;
ShardingTableProperties.Add(propertyInfo.Name, propertyInfo);
}
/// <summary>
/// 添加额外分表字段
/// </summary>
/// <param name="propertyInfo"></param>
/// <exception cref="ShardingCoreConfigException"></exception>
public void AddExtraSharingTableProperty(PropertyInfo propertyInfo)
{
if (ShardingTableProperties.ContainsKey(propertyInfo.Name))
throw new ShardingCoreConfigException($"same sharding table property name:[{propertyInfo.Name}] don't repeat add");
ShardingTableProperties.Add(propertyInfo.Name, propertyInfo);
} }
/// <summary> /// <summary>

View File

@ -27,7 +27,7 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions
protected override List<string> DoRouteWithPredicate(List<string> allDataSourceNames, IQueryable queryable) protected override List<string> DoRouteWithPredicate(List<string> allDataSourceNames, IQueryable queryable)
{ {
//获取路由后缀表达式 //获取路由后缀表达式
var routeParseExpression = ShardingUtil.GetRouteParseExpression<TKey>(queryable, EntityMetadata, GetRouteToFilter, false); var routeParseExpression = ShardingUtil.GetRouteParseExpression(queryable, EntityMetadata, GetRouteToFilter, false);
//表达式缓存编译 //表达式缓存编译
var filter = CachingCompile(routeParseExpression); var filter = CachingCompile(routeParseExpression);
//通过编译结果进行过滤 //通过编译结果进行过滤
@ -41,8 +41,29 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions
/// </summary> /// </summary>
/// <param name="shardingKey">分表的值</param> /// <param name="shardingKey">分表的值</param>
/// <param name="shardingOperator">操作</param> /// <param name="shardingOperator">操作</param>
/// <param name="shardingPropertyName">操作</param>
/// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns> /// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns>
public abstract Expression<Func<string, bool>> GetRouteToFilter(TKey shardingKey, ShardingOperatorEnum shardingOperator); public Expression<Func<string, bool>> GetRouteToFilter(object shardingKey,
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
{
if (EntityMetadata.IsMainShardingDataSourceKey(shardingPropertyName))
{
return GetMainRouteFilter((TKey)shardingKey, shardingOperator);
}
else
{
return GetExtraRouteFilter(shardingKey, shardingOperator, shardingPropertyName);
}
}
public abstract Expression<Func<string, bool>> GetMainRouteFilter(TKey shardingKey,
ShardingOperatorEnum shardingOperator);
public virtual Expression<Func<string, bool>> GetExtraRouteFilter(object shardingKey,
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
{
throw new NotImplementedException(shardingPropertyName);
}
public override string RouteWithValue(object shardingKey) public override string RouteWithValue(object shardingKey)
{ {

View File

@ -21,7 +21,7 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
protected override List<IPhysicTable> DoRouteWithPredicate(List<IPhysicTable> allPhysicTables, IQueryable queryable) protected override List<IPhysicTable> DoRouteWithPredicate(List<IPhysicTable> allPhysicTables, IQueryable queryable)
{ {
//获取路由后缀表达式 //获取路由后缀表达式
var routeParseExpression = ShardingUtil.GetRouteParseExpression<TKey>(queryable, EntityMetadata, GetRouteToFilter,true); var routeParseExpression = ShardingUtil.GetRouteParseExpression(queryable, EntityMetadata, GetRouteToFilter,true);
//表达式缓存编译 //表达式缓存编译
var filter =CachingCompile(routeParseExpression); var filter =CachingCompile(routeParseExpression);
//通过编译结果进行过滤 //通过编译结果进行过滤
@ -35,8 +35,29 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
/// </summary> /// </summary>
/// <param name="shardingKey">分表的值</param> /// <param name="shardingKey">分表的值</param>
/// <param name="shardingOperator">操作</param> /// <param name="shardingOperator">操作</param>
/// <param name="shardingPropertyName">分表字段</param>
/// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns> /// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns>
public abstract Expression<Func<string, bool>> GetRouteToFilter(TKey shardingKey, ShardingOperatorEnum shardingOperator); public Expression<Func<string, bool>> GetRouteToFilter(object shardingKey,
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
{
if (EntityMetadata.IsMainShardingTableKey(shardingPropertyName))
{
return GetMainRouteFilter((TKey)shardingKey, shardingOperator);
}
else
{
return GetExtraRouteFilter(shardingKey, shardingOperator, shardingPropertyName);
}
}
public abstract Expression<Func<string, bool>> GetMainRouteFilter(TKey shardingKey,
ShardingOperatorEnum shardingOperator);
public virtual Expression<Func<string, bool>> GetExtraRouteFilter(object shardingKey,
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
{
throw new NotImplementedException(shardingPropertyName);
}
public override IPhysicTable RouteWithValue(List<IPhysicTable> allPhysicTables, object shardingKey) public override IPhysicTable RouteWithValue(List<IPhysicTable> allPhysicTables, object shardingKey)
{ {

View File

@ -21,5 +21,18 @@ namespace ShardingCore.Extensions
return false; return false;
return metadata.ShardingTableProperty.Name == metadata.PrimaryKeyProperties.First().Name; return metadata.ShardingTableProperty.Name == metadata.PrimaryKeyProperties.First().Name;
} }
public static bool IsMainShardingTableKey(this EntityMetadata metadata, string shardingPropertyName)
{
if (metadata.ShardingTableProperty.Name == shardingPropertyName)
return true;
return false;
}
public static bool IsMainShardingDataSourceKey(this EntityMetadata metadata, string shardingPropertyName)
{
if (metadata.ShardingDataSourceProperty.Name == shardingPropertyName)
return true;
return false;
}
} }
} }

View File

@ -1,7 +1,10 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using ShardingCore.Core.EntityMetadatas;
using ShardingCore.Core.Internal.Visitors; using ShardingCore.Core.Internal.Visitors;
using ShardingCore.Sharding.Visitors; using ShardingCore.Sharding.Visitors;

View File

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using ShardingCore.Core.EntityMetadatas;
using ShardingCore.Core.Internal.Visitors; using ShardingCore.Core.Internal.Visitors;
using ShardingCore.Exceptions; using ShardingCore.Exceptions;
using ShardingCore.Extensions; using ShardingCore.Extensions;

View File

@ -23,6 +23,7 @@ namespace ShardingCore.Core.Internal.Visitors
private GroupByContext _groupByContext=new GroupByContext(); private GroupByContext _groupByContext=new GroupByContext();
private SelectContext _selectContext=new SelectContext(); private SelectContext _selectContext=new SelectContext();
public SelectContext GetSelectContext() public SelectContext GetSelectContext()
{ {
return _selectContext; return _selectContext;

View File

@ -24,18 +24,20 @@ namespace ShardingCore.Core.Internal.Visitors
* @Date: Monday, 28 December 2020 22:09:39 * @Date: Monday, 28 December 2020 22:09:39
* @Email: 326308290@qq.com * @Email: 326308290@qq.com
*/ */
public class QueryableRouteShardingTableDiscoverVisitor<TKey> : ExpressionVisitor public class QueryableRouteShardingTableDiscoverVisitor : ExpressionVisitor
{ {
private readonly EntityMetadata _entityMetadata; private readonly EntityMetadata _entityMetadata;
private readonly Func<TKey, ShardingOperatorEnum, Expression<Func<string, bool>>> _keyToTailWithFilter; private readonly Func<object, ShardingOperatorEnum, string, Expression<Func<string, bool>>> _keyToTailWithFilter;
/// <summary> /// <summary>
/// 是否是分表路由 /// 是否是分表路由
/// </summary> /// </summary>
private readonly bool _shardingTableRoute; private readonly bool _shardingTableRoute;
private Expression<Func<string, bool>> _where = x => true; private Expression<Func<string, bool>> _where = x => true;
public QueryableRouteShardingTableDiscoverVisitor(EntityMetadata entityMetadata, Func<TKey, ShardingOperatorEnum, Expression<Func<string, bool>>> keyToTailWithFilter, bool shardingTableRoute) private readonly ShardingPredicateResult _noShardingPredicateResult = new ShardingPredicateResult(false, null);
public QueryableRouteShardingTableDiscoverVisitor(EntityMetadata entityMetadata, Func<object, ShardingOperatorEnum, string, Expression<Func<string, bool>>> keyToTailWithFilter, bool shardingTableRoute)
{ {
_entityMetadata = entityMetadata; _entityMetadata = entityMetadata;
_keyToTailWithFilter = keyToTailWithFilter; _keyToTailWithFilter = keyToTailWithFilter;
@ -48,36 +50,53 @@ namespace ShardingCore.Core.Internal.Visitors
} }
private bool IsShardingKey(Expression expression) private ShardingPredicateResult IsShardingKey(Expression expression)
{ {
return expression is MemberExpression member if (expression is MemberExpression member)
&& member.Expression.Type == _entityMetadata.EntityType {
&& member.Member.Name == (_shardingTableRoute ? _entityMetadata.ShardingTableProperty.Name : _entityMetadata.ShardingDataSourceProperty.Name); if (member.Expression.Type == _entityMetadata.EntityType)
{
var isShardingKey = false;
if (_shardingTableRoute)
{
isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(member.Member.Name);
}
else
{
isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(member.Member.Name);
}
return new ShardingPredicateResult(isShardingKey, isShardingKey?member.Member.Name:null);
}
}
return _noShardingPredicateResult;
} }
/// <summary> /// <summary>
/// 方法是否包含shardingKey xxx.invoke(shardingkey) eg. <code>o=>new[]{}.Contains(o.Id)</code> /// 方法是否包含shardingKey xxx.invoke(shardingkey) eg. <code>o=>new[]{}.Contains(o.Id)</code>
/// </summary> /// </summary>
/// <param name="methodCallExpression"></param> /// <param name="methodCallExpression"></param>
/// <returns></returns> /// <returns></returns>
private bool IsMethodWrapShardingKey(MethodCallExpression methodCallExpression) private ShardingPredicateResult IsMethodWrapShardingKey(MethodCallExpression methodCallExpression)
{ {
if (methodCallExpression.Arguments.IsNotEmpty()) if (methodCallExpression.Arguments.IsNotEmpty())
{ {
for (int i = 0; i < methodCallExpression.Arguments.Count; i++) for (int i = 0; i < methodCallExpression.Arguments.Count; i++)
{ {
var isShardingKey = methodCallExpression.Arguments[i] is MemberExpression member var result = IsShardingKey(methodCallExpression.Arguments[i]);
&& member.Expression.Type == _entityMetadata.EntityType if (result.IsShardingKey)
&& member.Member.Name == (_shardingTableRoute ? _entityMetadata.ShardingTableProperty.Name : _entityMetadata.ShardingDataSourceProperty.Name); return result;
if (isShardingKey) return true;
} }
} }
return _noShardingPredicateResult;
}
return false; private ShardingPredicateResult IsShardingWrapConstant(MethodCallExpression methodCallExpression)
}
private bool IsShardingWrapConstant(MethodCallExpression methodCallExpression)
{ {
return methodCallExpression.Object != null && IsShardingKey(methodCallExpression.Object); if (methodCallExpression.Object != null)
{
return IsShardingKey(methodCallExpression.Object);
}
return _noShardingPredicateResult;
} }
private bool IsConstantOrMember(Expression expression) private bool IsConstantOrMember(Expression expression)
{ {
@ -91,15 +110,15 @@ namespace ShardingCore.Core.Internal.Visitors
return expression is MethodCallExpression; return expression is MethodCallExpression;
} }
private TKey GetShardingKeyValue(Expression expression) private object GetShardingKeyValue(Expression expression)
{ {
if (expression is ConstantExpression constantExpression) if (expression is ConstantExpression constantExpression)
{ {
return (TKey)constantExpression.Value; return constantExpression.Value;
} }
if (expression is UnaryExpression unaryExpression) if (expression is UnaryExpression unaryExpression)
{ {
return Expression.Lambda<Func<TKey>>(unaryExpression.Operand).Compile()(); return Expression.Lambda(unaryExpression.Operand).Compile().DynamicInvoke();
} }
if (expression is MemberExpression member1Expression) if (expression is MemberExpression member1Expression)
@ -110,24 +129,24 @@ namespace ShardingCore.Core.Internal.Visitors
if (member1Expression.Member is FieldInfo memberFieldInfo) if (member1Expression.Member is FieldInfo memberFieldInfo)
{ {
object container = memberConstantExpression.Value; object container = memberConstantExpression.Value;
return (TKey)memberFieldInfo.GetValue(container); return memberFieldInfo.GetValue(container);
} }
if (member1Expression.Member is PropertyInfo memberPropertyInfo) if (member1Expression.Member is PropertyInfo memberPropertyInfo)
{ {
object container = memberConstantExpression.Value; object container = memberConstantExpression.Value;
return (TKey)memberPropertyInfo.GetValue(container); return memberPropertyInfo.GetValue(container);
} }
else if (memberConstantExpression.Value is TKey shardingKeyValue) else
{ {
return shardingKeyValue; return memberConstantExpression.Value;
} }
} }
return Expression.Lambda<Func<TKey>>(member1Expression).Compile()(); return Expression.Lambda(member1Expression).Compile().DynamicInvoke();
} }
if (expression is MethodCallExpression methodCallExpression) if (expression is MethodCallExpression methodCallExpression)
{ {
return Expression.Lambda<Func<TKey>>(methodCallExpression).Compile()(); return Expression.Lambda(methodCallExpression).Compile().DynamicInvoke();
//return methodCallExpression.Method.Invoke( //return methodCallExpression.Method.Invoke(
// GetShardingKeyValue(methodCallExpression.Object), // GetShardingKeyValue(methodCallExpression.Object),
// methodCallExpression.Arguments // methodCallExpression.Arguments
@ -190,7 +209,10 @@ namespace ShardingCore.Core.Internal.Visitors
private Expression<Func<string, bool>> ResolveInFunc(MethodCallExpression methodCallExpression, bool @in) private Expression<Func<string, bool>> ResolveInFunc(MethodCallExpression methodCallExpression, bool @in)
{ {
if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name) && IsMethodWrapShardingKey(methodCallExpression)) if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name))
{
var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
if (shardingPredicateResult.IsShardingKey)
{ {
object arrayObject = null; object arrayObject = null;
if (methodCallExpression.Object != null) if (methodCallExpression.Object != null)
@ -243,39 +265,39 @@ namespace ShardingCore.Core.Internal.Visitors
if (arrayObject is IEnumerable enumerableObj) if (arrayObject is IEnumerable enumerableObj)
{ {
foreach (var item in enumerableObj) foreach (var shardingValue in enumerableObj)
{ {
if (item is TKey shardingValue) var eq = _keyToTailWithFilter(shardingValue, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual, shardingPredicateResult.ShardingPropertyName);
{
var eq = _keyToTailWithFilter(shardingValue, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
if (@in) if (@in)
contains = contains.Or(eq); contains = contains.Or(eq);
else else
contains = contains.And(eq); contains = contains.And(eq);
} }
} }
}
return contains; return contains;
} }
} }
}
if (methodCallExpression.IsNamedEquals()) if (methodCallExpression.IsNamedEquals())
{ {
//"".equals(o.id) //"".equals(o.id)
if (IsMethodWrapShardingKey(methodCallExpression)) var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
if (shardingPredicateResult.IsShardingKey)
{ {
if (methodCallExpression.Object is ConstantExpression constantExpression) if (methodCallExpression.Object is ConstantExpression constantExpression)
{ {
if (constantExpression.Value is TKey shardingValue) var shardingValue = constantExpression.Value;
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
}
}
else
{ {
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal);
}
}
}
//o.id.equals("") //o.id.equals("")
else if (IsShardingWrapConstant(methodCallExpression)) shardingPredicateResult = IsShardingWrapConstant(methodCallExpression);
if (shardingPredicateResult.IsShardingKey)
{ {
TKey shardingValue = default; object shardingValue = default;
if (methodCallExpression.Arguments[0] is MemberExpression member2Expression) if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
{ {
shardingValue = GetShardingKeyValue(member2Expression); shardingValue = GetShardingKeyValue(member2Expression);
@ -285,9 +307,10 @@ namespace ShardingCore.Core.Internal.Visitors
shardingValue = GetShardingKeyValue(constantExpression); shardingValue = GetShardingKeyValue(constantExpression);
} }
if (!EqualityComparer<TKey>.Default.Equals(shardingValue, default)) if (shardingValue != default)
{ {
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal); return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
}
} }
} }
} }
@ -326,21 +349,35 @@ namespace ShardingCore.Core.Internal.Visitors
{ {
//条件在右边 //条件在右边
bool conditionOnRight = false; bool conditionOnRight = false;
TKey value = default; string shardingPropertyName = null;
object value = default;
if (IsShardingKey(binaryExpression.Left) && IsConstantOrMember(binaryExpression.Right)) if (IsConstantOrMember(binaryExpression.Right))
{
var shardingPredicateResult = IsShardingKey(binaryExpression.Left);
if (shardingPredicateResult.IsShardingKey)
{ {
conditionOnRight = true; conditionOnRight = true;
shardingPropertyName = shardingPredicateResult.ShardingPropertyName;
value = GetShardingKeyValue(binaryExpression.Right); value = GetShardingKeyValue(binaryExpression.Right);
} }
else if (IsConstantOrMember(binaryExpression.Left) && IsShardingKey(binaryExpression.Right)) else
return x => true;
}
else if (IsConstantOrMember(binaryExpression.Left))
{
var shardingPredicateResult = IsShardingKey(binaryExpression.Right);
if (shardingPredicateResult.IsShardingKey)
{ {
conditionOnRight = false; conditionOnRight = false;
shardingPropertyName = shardingPredicateResult.ShardingPropertyName;
value = GetShardingKeyValue(binaryExpression.Left); value = GetShardingKeyValue(binaryExpression.Left);
} }
else else
return x => true; return x => true;
}
else
return x => true;
var op = binaryExpression.NodeType switch var op = binaryExpression.NodeType switch
{ {
@ -353,12 +390,31 @@ namespace ShardingCore.Core.Internal.Visitors
_ => ShardingOperatorEnum.UnKnown _ => ShardingOperatorEnum.UnKnown
}; };
if (EqualityComparer<TKey>.Default.Equals(value, default)) if (shardingPropertyName == null || value == default)
return x => true; return x => true;
return _keyToTailWithFilter(value, op); return _keyToTailWithFilter(value, op, shardingPropertyName);
} }
} }
} }
/// <summary>
/// 分片条件结果
/// </summary>
internal class ShardingPredicateResult
{
public ShardingPredicateResult(bool isShardingKey, string shardingPropertyName)
{
IsShardingKey = isShardingKey;
ShardingPropertyName = shardingPropertyName;
}
/// <summary>
/// 是否是分片字段
/// </summary>
public bool IsShardingKey { get; }
/// <summary>
/// 分片字段名称
/// </summary>
public string ShardingPropertyName { get; }
}
} }

View File

@ -0,0 +1,200 @@
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Linq.Expressions;
//using System.Reflection;
//using System.Text;
//using System.Threading.Tasks;
//using ShardingCore.Core.EntityMetadatas;
//using ShardingCore.Core.VirtualRoutes;
//using ShardingCore.Exceptions;
//using ShardingCore.Extensions;
//namespace ShardingCore.Sharding.Visitors
//{
// internal class QueryableShardingPropertyDiscoverVisitor:ExpressionVisitor
// {
// private readonly IDictionary<Type, EntityMetadata> _queryEntities;
// private readonly Dictionary<Type,ISet<string>> _queryProperties;
// public QueryableShardingPropertyDiscoverVisitor(IDictionary<Type,EntityMetadata> queryEntities)
// {
// _queryEntities = queryEntities;
// _queryProperties = new Dictionary<Type, ISet<string>>();
// }
// public Dictionary<Type, ISet<string>> GetQueryProperties()
// {
// return _queryProperties;
// }
// private bool IsShardingKey(Expression expression)
// {
// if (expression is MemberExpression member)
// {
// if (_queryEntities.TryGetValue(member.Expression.Type, out var entityMetadata))
// {
// //是否是分片字段
// if (entityMetadata.ShardingDataSourceProperties.ContainsKey(member.Member.Name) ||
// entityMetadata.ShardingTableProperties.ContainsKey(member.Member.Name))
// {
// if (!_queryProperties.TryGetValue(member.Expression.Type,out var propertyInfos))
// {
// propertyInfos = new HashSet<string>();
// _queryProperties.Add(member.Expression.Type, propertyInfos);
// }
// propertyInfos.Add(member.Member.Name);
// return true;
// }
// }
// }
// return false;
// }
// /// <summary>
// /// 方法是否包含shardingKey xxx.invoke(shardingkey) eg. <code>o=>new[]{}.Contains(o.Id)</code>
// /// </summary>
// /// <param name="methodCallExpression"></param>
// /// <returns></returns>
// private bool IsMethodWrapShardingKey(MethodCallExpression methodCallExpression)
// {
// if (methodCallExpression.Arguments.IsNotEmpty())
// {
// for (int i = 0; i < methodCallExpression.Arguments.Count; i++)
// {
// var isShardingKey = IsShardingKey(methodCallExpression.Arguments[i]);
// if (isShardingKey) return true;
// }
// }
// return false;
// }
// private bool IsShardingWrapConstant(MethodCallExpression methodCallExpression)
// {
// return methodCallExpression.Object != null && IsShardingKey(methodCallExpression.Object);
// }
// private bool IsConstantOrMember(Expression expression)
// {
// return expression is ConstantExpression
// || (expression is MemberExpression member && (member.Expression is ConstantExpression || member.Expression is MemberExpression || member.Expression is MemberExpression))
// || expression is MethodCallExpression;
// }
// private bool IsMethodCall(Expression expression)
// {
// return expression is MethodCallExpression;
// }
// protected override Expression VisitMethodCall(MethodCallExpression node)
// {
// if (node.Method.Name == nameof(Queryable.Where))
// {
// if (node.Arguments[1] is UnaryExpression unaryExpression)
// {
// if (unaryExpression.Operand is LambdaExpression lambdaExpression)
// {
// Resolve(lambdaExpression);
// }
// }
// }
// return base.VisitMethodCall(node);
// }
// private Expression<Func<string, bool>> Resolve(Expression expression)
// {
// if (expression is LambdaExpression lambda)
// {
// expression = lambda.Body;
// return Resolve(expression);
// }
// if (expression is BinaryExpression binaryExpression) //解析二元运算符
// {
// return ParseGetWhere(binaryExpression);
// }
// if (expression is UnaryExpression unary) //解析一元运算符
// {
// if (unary.Operand is MethodCallExpression unaryCallExpression)
// {
// // return ResolveLinqToObject(unary.Operand, false);
// return ResolveInFunc(unaryCallExpression, unary.NodeType != ExpressionType.Not);
// }
// }
// if (expression is MethodCallExpression methodCallExpression) //解析扩展方法
// {
// return ResolveInFunc(methodCallExpression, true);
// }
// return o => true;
// }
// private Expression<Func<string, bool>> ResolveInFunc(MethodCallExpression methodCallExpression, bool @in)
// {
// if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name))
// {
// IsMethodWrapShardingKey(methodCallExpression);
// }
// if (methodCallExpression.IsNamedEquals())
// {
// //"".equals(o.id)
// if (IsMethodWrapShardingKey(methodCallExpression))
// {
// }
// //o.id.equals("")
// else if (IsShardingWrapConstant(methodCallExpression))
// {
// }
// }
// return x => true;
// }
// private Expression<Func<string, bool>> ParseGetWhere(BinaryExpression binaryExpression)
// {
// Expression<Func<string, bool>> left = x => true;
// Expression<Func<string, bool>> right = x => true;
// //递归获取
// if (binaryExpression.Left is BinaryExpression)
// left = ParseGetWhere(binaryExpression.Left as BinaryExpression);
// if (binaryExpression.Left is MethodCallExpression methodCallExpression)
// left = Resolve(methodCallExpression);
// if (binaryExpression.Left is UnaryExpression unaryExpression)
// left = Resolve(unaryExpression);
// if (binaryExpression.Right is BinaryExpression)
// right = ParseGetWhere(binaryExpression.Right as BinaryExpression);
// //组合
// if (binaryExpression.NodeType == ExpressionType.AndAlso)
// {
// return left.And(right);
// }
// else if (binaryExpression.NodeType == ExpressionType.OrElse)
// {
// return left.Or(right);
// }
// //单个
// else
// {
// //条件在右边
// if (IsConstantOrMember(binaryExpression.Right)&&IsShardingKey(binaryExpression.Left))
// {
// }
// else if (IsConstantOrMember(binaryExpression.Left) && IsShardingKey(binaryExpression.Right))
// {
// }
// return x => true;
// }
// }
// }
//}

View File

@ -53,15 +53,16 @@ namespace ShardingCore.Utils
/// <param name="keyToTailExpression"></param> /// <param name="keyToTailExpression"></param>
/// <param name="shardingTableRoute">sharding table or data source</param> /// <param name="shardingTableRoute">sharding table or data source</param>
/// <returns></returns> /// <returns></returns>
public static Expression<Func<string, bool>> GetRouteParseExpression<TKey>(IQueryable queryable, EntityMetadata entityMetadata, Func<TKey, ShardingOperatorEnum, Expression<Func<string, bool>>> keyToTailExpression,bool shardingTableRoute) public static Expression<Func<string, bool>> GetRouteParseExpression(IQueryable queryable, EntityMetadata entityMetadata, Func<object, ShardingOperatorEnum,string, Expression<Func<string, bool>>> keyToTailExpression,bool shardingTableRoute)
{ {
QueryableRouteShardingTableDiscoverVisitor<TKey> visitor = new QueryableRouteShardingTableDiscoverVisitor<TKey>(entityMetadata, keyToTailExpression, shardingTableRoute); QueryableRouteShardingTableDiscoverVisitor visitor = new QueryableRouteShardingTableDiscoverVisitor(entityMetadata, keyToTailExpression, shardingTableRoute);
visitor.Visit(queryable.Expression); visitor.Visit(queryable.Expression);
return visitor.GetRouteParseExpression(); return visitor.GetRouteParseExpression();
} }
/// <summary> /// <summary>
/// 获取本次查询的所有涉及到的对象 /// 获取本次查询的所有涉及到的对象
/// </summary> /// </summary>

View File

@ -1,4 +1,5 @@
using System; using System;
using ShardingCore.Extensions;
namespace ShardingCore.VirtualRoutes.Abstractions namespace ShardingCore.VirtualRoutes.Abstractions
{ {

View File

@ -49,9 +49,8 @@ namespace ShardingCore.VirtualRoutes.Days
return $"{time:yyyyMMdd}"; return $"{time:yyyyMMdd}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)
{ {

View File

@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Days
return $"{dateTime:yyyyMMdd}"; return $"{dateTime:yyyyMMdd}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -48,7 +48,7 @@ namespace ShardingCore.VirtualRoutes.Mods
return Enumerable.Range(0, Mod).Select(o => o.ToString().PadLeft(TailLength, PaddingChar)).ToList(); return Enumerable.Range(0, Mod).Select(o => o.ToString().PadLeft(TailLength, PaddingChar)).ToList();
} }
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToTail(shardingKey); var t = ShardingKeyToTail(shardingKey);

View File

@ -65,7 +65,7 @@ namespace ShardingCore.VirtualRoutes.Mods
/// <param name="shardingKey"></param> /// <param name="shardingKey"></param>
/// <param name="shardingOperator"></param> /// <param name="shardingOperator"></param>
/// <returns></returns> /// <returns></returns>
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToTail(shardingKey); var t = ShardingKeyToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -39,7 +39,7 @@ namespace ShardingCore.VirtualRoutes.Months
return $"{time:yyyyMM}"; return $"{time:yyyyMM}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Months
var datetime = ShardingCoreHelper.ConvertLongToDateTime(time); var datetime = ShardingCoreHelper.ConvertLongToDateTime(time);
return $"{datetime:yyyyMM}"; return $"{datetime:yyyyMM}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Weeks
return $"{currentMonday:yyyyMM}{currentMonday:dd}_{currentSunday:dd}"; return $"{currentMonday:yyyyMM}{currentMonday:dd}_{currentSunday:dd}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -50,7 +50,7 @@ namespace ShardingCore.VirtualRoutes.Weeks
return $"{currentMonday:yyyyMM}{currentMonday:dd}_{currentSunday:dd}"; return $"{currentMonday:yyyyMM}{currentMonday:dd}_{currentSunday:dd}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -37,7 +37,7 @@ namespace ShardingCore.VirtualRoutes.Years
{ {
return $"{time:yyyy}"; return $"{time:yyyy}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -60,7 +60,7 @@ namespace ShardingCore.VirtualRoutes.Years
/// <param name="shardingKey"></param> /// <param name="shardingKey"></param>
/// <param name="shardingOperator"></param> /// <param name="shardingOperator"></param>
/// <returns>当传入表后缀你告诉框架这个后缀是否需要被返回,分片字段如何筛选出后缀</returns> /// <returns>当传入表后缀你告诉框架这个后缀是否需要被返回,分片字段如何筛选出后缀</returns>
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -85,30 +85,30 @@ namespace ShardingCore.Test
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var xxxx = "202102"; var xxxx = "202102";
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -64,30 +64,30 @@ namespace ShardingCore.Test
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -42,7 +42,7 @@ namespace ShardingCore.Test.Shardings
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -46,7 +46,7 @@ namespace ShardingCore.Test.Shardings
return $"{dateOfMonth:yyyyMM}"; return $"{dateOfMonth:yyyyMM}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -73,30 +73,30 @@ namespace ShardingCore.Test2x
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -63,30 +63,30 @@ namespace ShardingCore.Test2x
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -42,7 +42,7 @@ namespace ShardingCore.Test2x.Shardings
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -45,7 +45,7 @@ namespace ShardingCore.Test2x.Shardings
return $"{dateOfMonth:yyyyMM}"; return $"{dateOfMonth:yyyyMM}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -73,30 +73,30 @@ namespace ShardingCore.Test3x
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -64,30 +64,30 @@ namespace ShardingCore.Test3x
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -42,7 +42,7 @@ namespace ShardingCore.Test3x.Shardings
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -46,7 +46,7 @@ namespace ShardingCore.Test3x.Shardings
return $"{dateOfMonth:yyyyMM}"; return $"{dateOfMonth:yyyyMM}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)

View File

@ -73,30 +73,30 @@ namespace ShardingCore.Test5x
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op, propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -65,30 +65,30 @@ namespace ShardingCore.Test5x
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute(); var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102); var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata, var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102); var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata, var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var xxxx1 = 202102; var xxxx1 = 202102;
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1); var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata, var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101); var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata, var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101); var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata, var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101); var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata, var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth); var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata, var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth); var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata, var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true); (i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));

View File

@ -42,7 +42,7 @@ namespace ShardingCore.Test5x.Shardings
} }
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = ShardingKeyToDataSourceName(shardingKey); var t = ShardingKeyToDataSourceName(shardingKey);

View File

@ -45,7 +45,7 @@ namespace ShardingCore.Test5x.Shardings
return $"{dateOfMonth:yyyyMM}"; return $"{dateOfMonth:yyyyMM}";
} }
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator) public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
{ {
var t = TimeFormatToTail(shardingKey); var t = TimeFormatToTail(shardingKey);
switch (shardingOperator) switch (shardingOperator)