[#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}";
}
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);
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);
switch (shardingOperator)

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingAll.VirtualDataSourceRoutes
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);

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingAll.VirtualDataSourceRoutes
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);

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingDataSource.VirtualRoutes
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);

View File

@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingDataSource.VirtualRoutes
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);

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路由仅支持等于所以仅仅只需要写等于的情况
var t = ShardingKeyToTail(shardingKey);

View File

@ -1,4 +1,5 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Reflection;
using ShardingCore.Exceptions;
@ -18,6 +19,8 @@ namespace ShardingCore.Core.EntityMetadatas
ShardingDbContextType = shardingDbContextType;
PrimaryKeyProperties = primaryKeyProperties;
IsSingleKey= PrimaryKeyProperties.Count == 1;
ShardingDataSourceProperties = new Dictionary<string, PropertyInfo>();
ShardingTableProperties = new Dictionary<string, PropertyInfo>();
}
/// <summary>
/// 分表类型 sharding entity type
@ -52,6 +55,10 @@ namespace ShardingCore.Core.EntityMetadatas
/// 分库字段
/// </summary>
public PropertyInfo ShardingDataSourceProperty { get; private set; }
/// <summary>
/// 分库所有字段包括 ShardingDataSourceProperty
/// </summary>
public IDictionary<string, PropertyInfo> ShardingDataSourceProperties { get; }
/// <summary>
/// 启动时是否建表 auto create data source when start app
@ -62,6 +69,10 @@ namespace ShardingCore.Core.EntityMetadatas
/// 分表字段 sharding table property
/// </summary>
public PropertyInfo ShardingTableProperty { get; private set; }
/// <summary>
/// 分表所有字段包括 ShardingTableProperty
/// </summary>
public IDictionary<string, PropertyInfo> ShardingTableProperties { get;}
/// <summary>
@ -80,8 +91,21 @@ namespace ShardingCore.Core.EntityMetadatas
public void SetShardingDataSourceProperty(PropertyInfo 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;
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>
/// 设置分表字段
@ -90,7 +114,21 @@ namespace ShardingCore.Core.EntityMetadatas
public void SetShardingTableProperty(PropertyInfo 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;
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>

View File

@ -27,7 +27,7 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions
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);
//通过编译结果进行过滤
@ -41,8 +41,29 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions
/// </summary>
/// <param name="shardingKey">分表的值</param>
/// <param name="shardingOperator">操作</param>
/// <param name="shardingPropertyName">操作</param>
/// <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)
{

View File

@ -21,7 +21,7 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
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);
//通过编译结果进行过滤
@ -35,8 +35,29 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
/// </summary>
/// <param name="shardingKey">分表的值</param>
/// <param name="shardingOperator">操作</param>
/// <param name="shardingPropertyName">分表字段</param>
/// <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)
{

View File

@ -21,5 +21,18 @@ namespace ShardingCore.Extensions
return false;
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.Linq;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;
using ShardingCore.Core.EntityMetadatas;
using ShardingCore.Core.Internal.Visitors;
using ShardingCore.Sharding.Visitors;

View File

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

View File

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

View File

@ -24,18 +24,20 @@ namespace ShardingCore.Core.Internal.Visitors
* @Date: Monday, 28 December 2020 22:09:39
* @Email: 326308290@qq.com
*/
public class QueryableRouteShardingTableDiscoverVisitor<TKey> : ExpressionVisitor
public class QueryableRouteShardingTableDiscoverVisitor : ExpressionVisitor
{
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>
private readonly bool _shardingTableRoute;
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;
_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
&& member.Expression.Type == _entityMetadata.EntityType
&& member.Member.Name == (_shardingTableRoute ? _entityMetadata.ShardingTableProperty.Name : _entityMetadata.ShardingDataSourceProperty.Name);
if (expression is MemberExpression member)
{
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>
/// 方法是否包含shardingKey xxx.invoke(shardingkey) eg. <code>o=>new[]{}.Contains(o.Id)</code>
/// </summary>
/// <param name="methodCallExpression"></param>
/// <returns></returns>
private bool IsMethodWrapShardingKey(MethodCallExpression methodCallExpression)
private ShardingPredicateResult IsMethodWrapShardingKey(MethodCallExpression methodCallExpression)
{
if (methodCallExpression.Arguments.IsNotEmpty())
{
for (int i = 0; i < methodCallExpression.Arguments.Count; i++)
{
var isShardingKey = methodCallExpression.Arguments[i] is MemberExpression member
&& member.Expression.Type == _entityMetadata.EntityType
&& member.Member.Name == (_shardingTableRoute ? _entityMetadata.ShardingTableProperty.Name : _entityMetadata.ShardingDataSourceProperty.Name);
if (isShardingKey) return true;
var result = IsShardingKey(methodCallExpression.Arguments[i]);
if (result.IsShardingKey)
return result;
}
}
return false;
return _noShardingPredicateResult;
}
private bool IsShardingWrapConstant(MethodCallExpression methodCallExpression)
private ShardingPredicateResult 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)
{
@ -91,15 +110,15 @@ namespace ShardingCore.Core.Internal.Visitors
return expression is MethodCallExpression;
}
private TKey GetShardingKeyValue(Expression expression)
private object GetShardingKeyValue(Expression expression)
{
if (expression is ConstantExpression constantExpression)
{
return (TKey)constantExpression.Value;
return constantExpression.Value;
}
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)
@ -110,24 +129,24 @@ namespace ShardingCore.Core.Internal.Visitors
if (member1Expression.Member is FieldInfo memberFieldInfo)
{
object container = memberConstantExpression.Value;
return (TKey)memberFieldInfo.GetValue(container);
return memberFieldInfo.GetValue(container);
}
if (member1Expression.Member is PropertyInfo memberPropertyInfo)
{
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)
{
return Expression.Lambda<Func<TKey>>(methodCallExpression).Compile()();
return Expression.Lambda(methodCallExpression).Compile().DynamicInvoke();
//return methodCallExpression.Method.Invoke(
// GetShardingKeyValue(methodCallExpression.Object),
// methodCallExpression.Arguments
@ -190,104 +209,108 @@ namespace ShardingCore.Core.Internal.Visitors
private Expression<Func<string, bool>> ResolveInFunc(MethodCallExpression methodCallExpression, bool @in)
{
if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name) && IsMethodWrapShardingKey(methodCallExpression))
if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name))
{
object arrayObject = null;
if (methodCallExpression.Object != null)
var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
if (shardingPredicateResult.IsShardingKey)
{
if (methodCallExpression.Object is MemberExpression member1Expression)
object arrayObject = null;
if (methodCallExpression.Object != null)
{
arrayObject = Expression.Lambda(member1Expression).Compile().DynamicInvoke();
if (methodCallExpression.Object is MemberExpression member1Expression)
{
arrayObject = Expression.Lambda(member1Expression).Compile().DynamicInvoke();
}
else if (methodCallExpression.Object is ListInitExpression member2Expression)
{
arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke();
}
}
else if (methodCallExpression.Object is ListInitExpression member2Expression)
else if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
{
arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke();
}
}
else if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
{
arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke();
}
else if (methodCallExpression.Arguments[0] is NewArrayExpression member3Expression)
{
arrayObject = Expression.Lambda(member3Expression).Compile().DynamicInvoke();
}
if (arrayObject != null)
{
Expression<Func<string, bool>> contains = x => false;
if (!@in)
contains = x => true;
//if (arrayObject is IEnumerable<TKey> enumerableKey)
//{
// foreach (var item in enumerableKey)
// {
// var eq = _keyToTailWithFilter(item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
// if (@in)
// contains = contains.Or(eq);
// else
// contains = contains.And(eq);
// }
//}else if (arrayObject is IEnumerable enumerableObj)
//{
// foreach (var item in enumerableObj)
// {
// var eq = _keyToTailWithFilter((TKey)item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
// if (@in)
// contains = contains.Or(eq);
// else
// contains = contains.And(eq);
// }
//}
if (arrayObject is IEnumerable enumerableObj)
else if (methodCallExpression.Arguments[0] is NewArrayExpression member3Expression)
{
foreach (var item in enumerableObj)
arrayObject = Expression.Lambda(member3Expression).Compile().DynamicInvoke();
}
if (arrayObject != null)
{
Expression<Func<string, bool>> contains = x => false;
if (!@in)
contains = x => true;
//if (arrayObject is IEnumerable<TKey> enumerableKey)
//{
// foreach (var item in enumerableKey)
// {
// var eq = _keyToTailWithFilter(item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
// if (@in)
// contains = contains.Or(eq);
// else
// contains = contains.And(eq);
// }
//}else if (arrayObject is IEnumerable enumerableObj)
//{
// foreach (var item in enumerableObj)
// {
// var eq = _keyToTailWithFilter((TKey)item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
// if (@in)
// contains = contains.Or(eq);
// else
// contains = contains.And(eq);
// }
//}
if (arrayObject is IEnumerable enumerableObj)
{
if (item is TKey shardingValue)
foreach (var shardingValue in enumerableObj)
{
var eq = _keyToTailWithFilter(shardingValue, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
var eq = _keyToTailWithFilter(shardingValue, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual, shardingPredicateResult.ShardingPropertyName);
if (@in)
contains = contains.Or(eq);
else
contains = contains.And(eq);
}
}
return contains;
}
return contains;
}
}
if (methodCallExpression.IsNamedEquals())
{
//"".equals(o.id)
if (IsMethodWrapShardingKey(methodCallExpression))
var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
if (shardingPredicateResult.IsShardingKey)
{
if (methodCallExpression.Object is ConstantExpression constantExpression)
{
if (constantExpression.Value is TKey shardingValue)
{
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal);
}
var shardingValue = constantExpression.Value;
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
}
}
//o.id.equals("")
else if (IsShardingWrapConstant(methodCallExpression))
else
{
TKey shardingValue = default;
if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
//o.id.equals("")
shardingPredicateResult = IsShardingWrapConstant(methodCallExpression);
if (shardingPredicateResult.IsShardingKey)
{
shardingValue = GetShardingKeyValue(member2Expression);
}
else if (methodCallExpression.Arguments[0] is ConstantExpression constantExpression)
{
shardingValue = GetShardingKeyValue(constantExpression);
}
object shardingValue = default;
if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
{
shardingValue = GetShardingKeyValue(member2Expression);
}
else if (methodCallExpression.Arguments[0] is ConstantExpression constantExpression)
{
shardingValue = GetShardingKeyValue(constantExpression);
}
if (!EqualityComparer<TKey>.Default.Equals(shardingValue, default))
{
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal);
if (shardingValue != default)
{
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
}
}
}
}
@ -326,18 +349,32 @@ namespace ShardingCore.Core.Internal.Visitors
{
//条件在右边
bool conditionOnRight = false;
TKey value = default;
string shardingPropertyName = null;
object value = default;
if (IsShardingKey(binaryExpression.Left) && IsConstantOrMember(binaryExpression.Right))
if (IsConstantOrMember(binaryExpression.Right))
{
conditionOnRight = true;
value = GetShardingKeyValue(binaryExpression.Right);
var shardingPredicateResult = IsShardingKey(binaryExpression.Left);
if (shardingPredicateResult.IsShardingKey)
{
conditionOnRight = true;
shardingPropertyName = shardingPredicateResult.ShardingPropertyName;
value = GetShardingKeyValue(binaryExpression.Right);
}
else
return x => true;
}
else if (IsConstantOrMember(binaryExpression.Left) && IsShardingKey(binaryExpression.Right))
else if (IsConstantOrMember(binaryExpression.Left))
{
conditionOnRight = false;
value = GetShardingKeyValue(binaryExpression.Left);
var shardingPredicateResult = IsShardingKey(binaryExpression.Right);
if (shardingPredicateResult.IsShardingKey)
{
conditionOnRight = false;
shardingPropertyName = shardingPredicateResult.ShardingPropertyName;
value = GetShardingKeyValue(binaryExpression.Left);
}
else
return x => true;
}
else
return x => true;
@ -353,12 +390,31 @@ namespace ShardingCore.Core.Internal.Visitors
_ => ShardingOperatorEnum.UnKnown
};
if (EqualityComparer<TKey>.Default.Equals(value, default))
if (shardingPropertyName == null || value == default)
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="shardingTableRoute">sharding table or data source</param>
/// <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);
return visitor.GetRouteParseExpression();
}
/// <summary>
/// 获取本次查询的所有涉及到的对象
/// </summary>

View File

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

View File

@ -49,9 +49,8 @@ namespace ShardingCore.VirtualRoutes.Days
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);
switch (shardingOperator)
{

View File

@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Days
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);
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();
}
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);

View File

@ -65,7 +65,7 @@ namespace ShardingCore.VirtualRoutes.Mods
/// <param name="shardingKey"></param>
/// <param name="shardingOperator"></param>
/// <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);
switch (shardingOperator)

View File

@ -39,7 +39,7 @@ namespace ShardingCore.VirtualRoutes.Months
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);
switch (shardingOperator)

View File

@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Months
var datetime = ShardingCoreHelper.ConvertLongToDateTime(time);
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);
switch (shardingOperator)

View File

@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Weeks
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);
switch (shardingOperator)

View File

@ -50,7 +50,7 @@ namespace ShardingCore.VirtualRoutes.Weeks
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);
switch (shardingOperator)

View File

@ -37,7 +37,7 @@ namespace ShardingCore.VirtualRoutes.Years
{
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);
switch (shardingOperator)

View File

@ -60,7 +60,7 @@ namespace ShardingCore.VirtualRoutes.Years
/// <param name="shardingKey"></param>
/// <param name="shardingOperator"></param>
/// <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);
switch (shardingOperator)

View File

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

View File

@ -46,7 +46,7 @@ namespace ShardingCore.Test.Shardings
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);
switch (shardingOperator)

View File

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

View File

@ -45,7 +45,7 @@ namespace ShardingCore.Test2x.Shardings
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);
switch (shardingOperator)

View File

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

View File

@ -46,7 +46,7 @@ namespace ShardingCore.Test3x.Shardings
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);
switch (shardingOperator)

View File

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

View File

@ -45,7 +45,7 @@ namespace ShardingCore.Test5x.Shardings
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);
switch (shardingOperator)