[#82]添加多字段辅助分库分片v1
This commit is contained in:
parent
6f3ce998e4
commit
c03e679901
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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; }
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -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>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using ShardingCore.Extensions;
|
||||||
|
|
||||||
namespace ShardingCore.VirtualRoutes.Abstractions
|
namespace ShardingCore.VirtualRoutes.Abstractions
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue