[#82]添加多字段辅助分库分片v1
This commit is contained in:
parent
6f3ce998e4
commit
c03e679901
|
@ -51,7 +51,7 @@ namespace Sample.SqlServer.Shardings
|
|||
return $"{dateOfMonth:yyyyMM}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace Sample.SqlServer.Shardings
|
|||
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = ShardingKeyToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingAll.VirtualDataSourceRoutes
|
|||
return true;
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
|
||||
var t = ShardingKeyToDataSourceName(shardingKey);
|
||||
|
|
|
@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingAll.VirtualDataSourceRoutes
|
|||
return true;
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
|
||||
var t = ShardingKeyToDataSourceName(shardingKey);
|
||||
|
|
|
@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingDataSource.VirtualRoutes
|
|||
return true;
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
|
||||
var t = ShardingKeyToDataSourceName(shardingKey);
|
||||
|
|
|
@ -34,7 +34,7 @@ namespace Sample.SqlServerShardingDataSource.VirtualRoutes
|
|||
return true;
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
|
||||
var t = ShardingKeyToDataSourceName(shardingKey);
|
||||
|
|
|
@ -48,7 +48,7 @@ namespace Sample.SqlServerShardingTable.VirtualRoutes
|
|||
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
//因为hash路由仅支持等于所以仅仅只需要写等于的情况
|
||||
var t = ShardingKeyToTail(shardingKey);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using ShardingCore.Exceptions;
|
||||
|
@ -18,6 +19,8 @@ namespace ShardingCore.Core.EntityMetadatas
|
|||
ShardingDbContextType = shardingDbContextType;
|
||||
PrimaryKeyProperties = primaryKeyProperties;
|
||||
IsSingleKey= PrimaryKeyProperties.Count == 1;
|
||||
ShardingDataSourceProperties = new Dictionary<string, PropertyInfo>();
|
||||
ShardingTableProperties = new Dictionary<string, PropertyInfo>();
|
||||
}
|
||||
/// <summary>
|
||||
/// 分表类型 sharding entity type
|
||||
|
@ -52,6 +55,10 @@ namespace ShardingCore.Core.EntityMetadatas
|
|||
/// 分库字段
|
||||
/// </summary>
|
||||
public PropertyInfo ShardingDataSourceProperty { get; private set; }
|
||||
/// <summary>
|
||||
/// 分库所有字段包括 ShardingDataSourceProperty
|
||||
/// </summary>
|
||||
public IDictionary<string, PropertyInfo> ShardingDataSourceProperties { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 启动时是否建表 auto create data source when start app
|
||||
|
@ -62,6 +69,10 @@ namespace ShardingCore.Core.EntityMetadatas
|
|||
/// 分表字段 sharding table property
|
||||
/// </summary>
|
||||
public PropertyInfo ShardingTableProperty { get; private set; }
|
||||
/// <summary>
|
||||
/// 分表所有字段包括 ShardingTableProperty
|
||||
/// </summary>
|
||||
public IDictionary<string, PropertyInfo> ShardingTableProperties { get;}
|
||||
|
||||
|
||||
/// <summary>
|
||||
|
@ -80,8 +91,21 @@ namespace ShardingCore.Core.EntityMetadatas
|
|||
public void SetShardingDataSourceProperty(PropertyInfo propertyInfo)
|
||||
{
|
||||
Check.NotNull(propertyInfo, nameof(propertyInfo));
|
||||
Check.ShouldNull(ShardingDataSourceProperty, nameof(ShardingDataSourceProperty));
|
||||
if (ShardingDataSourceProperties.ContainsKey(propertyInfo.Name))
|
||||
throw new ShardingCoreConfigException($"same sharding data source property name:[{propertyInfo.Name}] don't repeat add");
|
||||
ShardingDataSourceProperty = propertyInfo;
|
||||
ShardingDataSourceProperties.Add(propertyInfo.Name, propertyInfo);
|
||||
}
|
||||
/// <summary>
|
||||
/// 添加额外分表字段
|
||||
/// </summary>
|
||||
/// <param name="propertyInfo"></param>
|
||||
/// <exception cref="ShardingCoreConfigException"></exception>
|
||||
public void AddExtraSharingDataSourceProperty(PropertyInfo propertyInfo)
|
||||
{
|
||||
if (ShardingDataSourceProperties.ContainsKey(propertyInfo.Name))
|
||||
throw new ShardingCoreConfigException($"same sharding data source property name:[{propertyInfo.Name}] don't repeat add");
|
||||
ShardingDataSourceProperties.Add(propertyInfo.Name, propertyInfo);
|
||||
}
|
||||
/// <summary>
|
||||
/// 设置分表字段
|
||||
|
@ -90,7 +114,21 @@ namespace ShardingCore.Core.EntityMetadatas
|
|||
public void SetShardingTableProperty(PropertyInfo propertyInfo)
|
||||
{
|
||||
Check.NotNull(propertyInfo, nameof(propertyInfo));
|
||||
if (ShardingTableProperties.ContainsKey(propertyInfo.Name))
|
||||
throw new ShardingCoreConfigException($"same sharding table property name:[{propertyInfo.Name}] don't repeat add");
|
||||
ShardingTableProperty = propertyInfo;
|
||||
ShardingTableProperties.Add(propertyInfo.Name, propertyInfo);
|
||||
}
|
||||
/// <summary>
|
||||
/// 添加额外分表字段
|
||||
/// </summary>
|
||||
/// <param name="propertyInfo"></param>
|
||||
/// <exception cref="ShardingCoreConfigException"></exception>
|
||||
public void AddExtraSharingTableProperty(PropertyInfo propertyInfo)
|
||||
{
|
||||
if (ShardingTableProperties.ContainsKey(propertyInfo.Name))
|
||||
throw new ShardingCoreConfigException($"same sharding table property name:[{propertyInfo.Name}] don't repeat add");
|
||||
ShardingTableProperties.Add(propertyInfo.Name, propertyInfo);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -27,7 +27,7 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions
|
|||
protected override List<string> DoRouteWithPredicate(List<string> allDataSourceNames, IQueryable queryable)
|
||||
{
|
||||
//获取路由后缀表达式
|
||||
var routeParseExpression = ShardingUtil.GetRouteParseExpression<TKey>(queryable, EntityMetadata, GetRouteToFilter, false);
|
||||
var routeParseExpression = ShardingUtil.GetRouteParseExpression(queryable, EntityMetadata, GetRouteToFilter, false);
|
||||
//表达式缓存编译
|
||||
var filter = CachingCompile(routeParseExpression);
|
||||
//通过编译结果进行过滤
|
||||
|
@ -41,8 +41,29 @@ namespace ShardingCore.Core.VirtualRoutes.DataSourceRoutes.Abstractions
|
|||
/// </summary>
|
||||
/// <param name="shardingKey">分表的值</param>
|
||||
/// <param name="shardingOperator">操作</param>
|
||||
/// <param name="shardingPropertyName">操作</param>
|
||||
/// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns>
|
||||
public abstract Expression<Func<string, bool>> GetRouteToFilter(TKey shardingKey, ShardingOperatorEnum shardingOperator);
|
||||
public Expression<Func<string, bool>> GetRouteToFilter(object shardingKey,
|
||||
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
|
||||
{
|
||||
if (EntityMetadata.IsMainShardingDataSourceKey(shardingPropertyName))
|
||||
{
|
||||
return GetMainRouteFilter((TKey)shardingKey, shardingOperator);
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetExtraRouteFilter(shardingKey, shardingOperator, shardingPropertyName);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract Expression<Func<string, bool>> GetMainRouteFilter(TKey shardingKey,
|
||||
ShardingOperatorEnum shardingOperator);
|
||||
|
||||
public virtual Expression<Func<string, bool>> GetExtraRouteFilter(object shardingKey,
|
||||
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
|
||||
{
|
||||
throw new NotImplementedException(shardingPropertyName);
|
||||
}
|
||||
|
||||
public override string RouteWithValue(object shardingKey)
|
||||
{
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
|
|||
protected override List<IPhysicTable> DoRouteWithPredicate(List<IPhysicTable> allPhysicTables, IQueryable queryable)
|
||||
{
|
||||
//获取路由后缀表达式
|
||||
var routeParseExpression = ShardingUtil.GetRouteParseExpression<TKey>(queryable, EntityMetadata, GetRouteToFilter,true);
|
||||
var routeParseExpression = ShardingUtil.GetRouteParseExpression(queryable, EntityMetadata, GetRouteToFilter,true);
|
||||
//表达式缓存编译
|
||||
var filter =CachingCompile(routeParseExpression);
|
||||
//通过编译结果进行过滤
|
||||
|
@ -35,8 +35,29 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
|
|||
/// </summary>
|
||||
/// <param name="shardingKey">分表的值</param>
|
||||
/// <param name="shardingOperator">操作</param>
|
||||
/// <param name="shardingPropertyName">分表字段</param>
|
||||
/// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns>
|
||||
public abstract Expression<Func<string, bool>> GetRouteToFilter(TKey shardingKey, ShardingOperatorEnum shardingOperator);
|
||||
public Expression<Func<string, bool>> GetRouteToFilter(object shardingKey,
|
||||
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
|
||||
{
|
||||
if (EntityMetadata.IsMainShardingTableKey(shardingPropertyName))
|
||||
{
|
||||
return GetMainRouteFilter((TKey)shardingKey, shardingOperator);
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetExtraRouteFilter(shardingKey, shardingOperator, shardingPropertyName);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract Expression<Func<string, bool>> GetMainRouteFilter(TKey shardingKey,
|
||||
ShardingOperatorEnum shardingOperator);
|
||||
|
||||
public virtual Expression<Func<string, bool>> GetExtraRouteFilter(object shardingKey,
|
||||
ShardingOperatorEnum shardingOperator, string shardingPropertyName)
|
||||
{
|
||||
throw new NotImplementedException(shardingPropertyName);
|
||||
}
|
||||
|
||||
public override IPhysicTable RouteWithValue(List<IPhysicTable> allPhysicTables, object shardingKey)
|
||||
{
|
||||
|
|
|
@ -21,5 +21,18 @@ namespace ShardingCore.Extensions
|
|||
return false;
|
||||
return metadata.ShardingTableProperty.Name == metadata.PrimaryKeyProperties.First().Name;
|
||||
}
|
||||
|
||||
public static bool IsMainShardingTableKey(this EntityMetadata metadata, string shardingPropertyName)
|
||||
{
|
||||
if (metadata.ShardingTableProperty.Name == shardingPropertyName)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public static bool IsMainShardingDataSourceKey(this EntityMetadata metadata, string shardingPropertyName)
|
||||
{
|
||||
if (metadata.ShardingDataSourceProperty.Name == shardingPropertyName)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ShardingCore.Core.EntityMetadatas;
|
||||
using ShardingCore.Core.Internal.Visitors;
|
||||
using ShardingCore.Sharding.Visitors;
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using ShardingCore.Core.EntityMetadatas;
|
||||
using ShardingCore.Core.Internal.Visitors;
|
||||
using ShardingCore.Exceptions;
|
||||
using ShardingCore.Extensions;
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
private GroupByContext _groupByContext=new GroupByContext();
|
||||
private SelectContext _selectContext=new SelectContext();
|
||||
|
||||
|
||||
public SelectContext GetSelectContext()
|
||||
{
|
||||
return _selectContext;
|
||||
|
|
|
@ -24,18 +24,20 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
* @Date: Monday, 28 December 2020 22:09:39
|
||||
* @Email: 326308290@qq.com
|
||||
*/
|
||||
public class QueryableRouteShardingTableDiscoverVisitor<TKey> : ExpressionVisitor
|
||||
public class QueryableRouteShardingTableDiscoverVisitor : ExpressionVisitor
|
||||
{
|
||||
|
||||
private readonly EntityMetadata _entityMetadata;
|
||||
private readonly Func<TKey, ShardingOperatorEnum, Expression<Func<string, bool>>> _keyToTailWithFilter;
|
||||
private readonly Func<object, ShardingOperatorEnum, string, Expression<Func<string, bool>>> _keyToTailWithFilter;
|
||||
/// <summary>
|
||||
/// 是否是分表路由
|
||||
/// </summary>
|
||||
private readonly bool _shardingTableRoute;
|
||||
private Expression<Func<string, bool>> _where = x => true;
|
||||
|
||||
public QueryableRouteShardingTableDiscoverVisitor(EntityMetadata entityMetadata, Func<TKey, ShardingOperatorEnum, Expression<Func<string, bool>>> keyToTailWithFilter, bool shardingTableRoute)
|
||||
private readonly ShardingPredicateResult _noShardingPredicateResult = new ShardingPredicateResult(false, null);
|
||||
|
||||
public QueryableRouteShardingTableDiscoverVisitor(EntityMetadata entityMetadata, Func<object, ShardingOperatorEnum, string, Expression<Func<string, bool>>> keyToTailWithFilter, bool shardingTableRoute)
|
||||
{
|
||||
_entityMetadata = entityMetadata;
|
||||
_keyToTailWithFilter = keyToTailWithFilter;
|
||||
|
@ -48,36 +50,53 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
}
|
||||
|
||||
|
||||
private bool IsShardingKey(Expression expression)
|
||||
private ShardingPredicateResult IsShardingKey(Expression expression)
|
||||
{
|
||||
return expression is MemberExpression member
|
||||
&& member.Expression.Type == _entityMetadata.EntityType
|
||||
&& member.Member.Name == (_shardingTableRoute ? _entityMetadata.ShardingTableProperty.Name : _entityMetadata.ShardingDataSourceProperty.Name);
|
||||
if (expression is MemberExpression member)
|
||||
{
|
||||
if (member.Expression.Type == _entityMetadata.EntityType)
|
||||
{
|
||||
var isShardingKey = false;
|
||||
if (_shardingTableRoute)
|
||||
{
|
||||
isShardingKey = _entityMetadata.ShardingTableProperties.ContainsKey(member.Member.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
isShardingKey = _entityMetadata.ShardingDataSourceProperties.ContainsKey(member.Member.Name);
|
||||
}
|
||||
return new ShardingPredicateResult(isShardingKey, isShardingKey?member.Member.Name:null);
|
||||
}
|
||||
}
|
||||
|
||||
return _noShardingPredicateResult;
|
||||
}
|
||||
/// <summary>
|
||||
/// 方法是否包含shardingKey xxx.invoke(shardingkey) eg. <code>o=>new[]{}.Contains(o.Id)</code>
|
||||
/// </summary>
|
||||
/// <param name="methodCallExpression"></param>
|
||||
/// <returns></returns>
|
||||
private bool IsMethodWrapShardingKey(MethodCallExpression methodCallExpression)
|
||||
private ShardingPredicateResult IsMethodWrapShardingKey(MethodCallExpression methodCallExpression)
|
||||
{
|
||||
if (methodCallExpression.Arguments.IsNotEmpty())
|
||||
{
|
||||
for (int i = 0; i < methodCallExpression.Arguments.Count; i++)
|
||||
{
|
||||
var isShardingKey = methodCallExpression.Arguments[i] is MemberExpression member
|
||||
&& member.Expression.Type == _entityMetadata.EntityType
|
||||
&& member.Member.Name == (_shardingTableRoute ? _entityMetadata.ShardingTableProperty.Name : _entityMetadata.ShardingDataSourceProperty.Name);
|
||||
if (isShardingKey) return true;
|
||||
var result = IsShardingKey(methodCallExpression.Arguments[i]);
|
||||
if (result.IsShardingKey)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return _noShardingPredicateResult;
|
||||
}
|
||||
|
||||
private bool IsShardingWrapConstant(MethodCallExpression methodCallExpression)
|
||||
private ShardingPredicateResult IsShardingWrapConstant(MethodCallExpression methodCallExpression)
|
||||
{
|
||||
return methodCallExpression.Object != null && IsShardingKey(methodCallExpression.Object);
|
||||
if (methodCallExpression.Object != null)
|
||||
{
|
||||
return IsShardingKey(methodCallExpression.Object);
|
||||
}
|
||||
return _noShardingPredicateResult;
|
||||
}
|
||||
private bool IsConstantOrMember(Expression expression)
|
||||
{
|
||||
|
@ -91,15 +110,15 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
return expression is MethodCallExpression;
|
||||
}
|
||||
|
||||
private TKey GetShardingKeyValue(Expression expression)
|
||||
private object GetShardingKeyValue(Expression expression)
|
||||
{
|
||||
if (expression is ConstantExpression constantExpression)
|
||||
{
|
||||
return (TKey)constantExpression.Value;
|
||||
return constantExpression.Value;
|
||||
}
|
||||
if (expression is UnaryExpression unaryExpression)
|
||||
{
|
||||
return Expression.Lambda<Func<TKey>>(unaryExpression.Operand).Compile()();
|
||||
return Expression.Lambda(unaryExpression.Operand).Compile().DynamicInvoke();
|
||||
}
|
||||
|
||||
if (expression is MemberExpression member1Expression)
|
||||
|
@ -110,24 +129,24 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
if (member1Expression.Member is FieldInfo memberFieldInfo)
|
||||
{
|
||||
object container = memberConstantExpression.Value;
|
||||
return (TKey)memberFieldInfo.GetValue(container);
|
||||
return memberFieldInfo.GetValue(container);
|
||||
}
|
||||
if (member1Expression.Member is PropertyInfo memberPropertyInfo)
|
||||
{
|
||||
object container = memberConstantExpression.Value;
|
||||
return (TKey)memberPropertyInfo.GetValue(container);
|
||||
return memberPropertyInfo.GetValue(container);
|
||||
}
|
||||
else if (memberConstantExpression.Value is TKey shardingKeyValue)
|
||||
else
|
||||
{
|
||||
return shardingKeyValue;
|
||||
return memberConstantExpression.Value;
|
||||
}
|
||||
}
|
||||
return Expression.Lambda<Func<TKey>>(member1Expression).Compile()();
|
||||
return Expression.Lambda(member1Expression).Compile().DynamicInvoke();
|
||||
}
|
||||
|
||||
if (expression is MethodCallExpression methodCallExpression)
|
||||
{
|
||||
return Expression.Lambda<Func<TKey>>(methodCallExpression).Compile()();
|
||||
return Expression.Lambda(methodCallExpression).Compile().DynamicInvoke();
|
||||
//return methodCallExpression.Method.Invoke(
|
||||
// GetShardingKeyValue(methodCallExpression.Object),
|
||||
// methodCallExpression.Arguments
|
||||
|
@ -190,104 +209,108 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
|
||||
private Expression<Func<string, bool>> ResolveInFunc(MethodCallExpression methodCallExpression, bool @in)
|
||||
{
|
||||
if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name) && IsMethodWrapShardingKey(methodCallExpression))
|
||||
if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name))
|
||||
{
|
||||
object arrayObject = null;
|
||||
if (methodCallExpression.Object != null)
|
||||
var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
|
||||
if (shardingPredicateResult.IsShardingKey)
|
||||
{
|
||||
if (methodCallExpression.Object is MemberExpression member1Expression)
|
||||
object arrayObject = null;
|
||||
if (methodCallExpression.Object != null)
|
||||
{
|
||||
arrayObject = Expression.Lambda(member1Expression).Compile().DynamicInvoke();
|
||||
if (methodCallExpression.Object is MemberExpression member1Expression)
|
||||
{
|
||||
arrayObject = Expression.Lambda(member1Expression).Compile().DynamicInvoke();
|
||||
}
|
||||
else if (methodCallExpression.Object is ListInitExpression member2Expression)
|
||||
{
|
||||
arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke();
|
||||
}
|
||||
}
|
||||
else if (methodCallExpression.Object is ListInitExpression member2Expression)
|
||||
else if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
|
||||
{
|
||||
arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke();
|
||||
}
|
||||
}
|
||||
else if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
|
||||
{
|
||||
arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke();
|
||||
}
|
||||
else if (methodCallExpression.Arguments[0] is NewArrayExpression member3Expression)
|
||||
{
|
||||
arrayObject = Expression.Lambda(member3Expression).Compile().DynamicInvoke();
|
||||
}
|
||||
|
||||
if (arrayObject != null)
|
||||
{
|
||||
Expression<Func<string, bool>> contains = x => false;
|
||||
if (!@in)
|
||||
contains = x => true;
|
||||
//if (arrayObject is IEnumerable<TKey> enumerableKey)
|
||||
//{
|
||||
// foreach (var item in enumerableKey)
|
||||
// {
|
||||
// var eq = _keyToTailWithFilter(item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
|
||||
// if (@in)
|
||||
// contains = contains.Or(eq);
|
||||
// else
|
||||
// contains = contains.And(eq);
|
||||
// }
|
||||
|
||||
//}else if (arrayObject is IEnumerable enumerableObj)
|
||||
//{
|
||||
// foreach (var item in enumerableObj)
|
||||
// {
|
||||
// var eq = _keyToTailWithFilter((TKey)item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
|
||||
// if (@in)
|
||||
// contains = contains.Or(eq);
|
||||
// else
|
||||
// contains = contains.And(eq);
|
||||
// }
|
||||
//}
|
||||
|
||||
if (arrayObject is IEnumerable enumerableObj)
|
||||
else if (methodCallExpression.Arguments[0] is NewArrayExpression member3Expression)
|
||||
{
|
||||
foreach (var item in enumerableObj)
|
||||
arrayObject = Expression.Lambda(member3Expression).Compile().DynamicInvoke();
|
||||
}
|
||||
|
||||
if (arrayObject != null)
|
||||
{
|
||||
Expression<Func<string, bool>> contains = x => false;
|
||||
if (!@in)
|
||||
contains = x => true;
|
||||
//if (arrayObject is IEnumerable<TKey> enumerableKey)
|
||||
//{
|
||||
// foreach (var item in enumerableKey)
|
||||
// {
|
||||
// var eq = _keyToTailWithFilter(item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
|
||||
// if (@in)
|
||||
// contains = contains.Or(eq);
|
||||
// else
|
||||
// contains = contains.And(eq);
|
||||
// }
|
||||
|
||||
//}else if (arrayObject is IEnumerable enumerableObj)
|
||||
//{
|
||||
// foreach (var item in enumerableObj)
|
||||
// {
|
||||
// var eq = _keyToTailWithFilter((TKey)item, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
|
||||
// if (@in)
|
||||
// contains = contains.Or(eq);
|
||||
// else
|
||||
// contains = contains.And(eq);
|
||||
// }
|
||||
//}
|
||||
|
||||
if (arrayObject is IEnumerable enumerableObj)
|
||||
{
|
||||
if (item is TKey shardingValue)
|
||||
foreach (var shardingValue in enumerableObj)
|
||||
{
|
||||
var eq = _keyToTailWithFilter(shardingValue, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual);
|
||||
var eq = _keyToTailWithFilter(shardingValue, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual, shardingPredicateResult.ShardingPropertyName);
|
||||
if (@in)
|
||||
contains = contains.Or(eq);
|
||||
else
|
||||
contains = contains.And(eq);
|
||||
}
|
||||
}
|
||||
return contains;
|
||||
}
|
||||
return contains;
|
||||
}
|
||||
}
|
||||
|
||||
if (methodCallExpression.IsNamedEquals())
|
||||
{
|
||||
//"".equals(o.id)
|
||||
if (IsMethodWrapShardingKey(methodCallExpression))
|
||||
var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
|
||||
if (shardingPredicateResult.IsShardingKey)
|
||||
{
|
||||
if (methodCallExpression.Object is ConstantExpression constantExpression)
|
||||
{
|
||||
if (constantExpression.Value is TKey shardingValue)
|
||||
{
|
||||
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal);
|
||||
}
|
||||
var shardingValue = constantExpression.Value;
|
||||
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
|
||||
}
|
||||
}
|
||||
//o.id.equals("")
|
||||
else if (IsShardingWrapConstant(methodCallExpression))
|
||||
else
|
||||
{
|
||||
TKey shardingValue = default;
|
||||
if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
|
||||
//o.id.equals("")
|
||||
shardingPredicateResult = IsShardingWrapConstant(methodCallExpression);
|
||||
if (shardingPredicateResult.IsShardingKey)
|
||||
{
|
||||
shardingValue = GetShardingKeyValue(member2Expression);
|
||||
}
|
||||
else if (methodCallExpression.Arguments[0] is ConstantExpression constantExpression)
|
||||
{
|
||||
shardingValue = GetShardingKeyValue(constantExpression);
|
||||
}
|
||||
object shardingValue = default;
|
||||
if (methodCallExpression.Arguments[0] is MemberExpression member2Expression)
|
||||
{
|
||||
shardingValue = GetShardingKeyValue(member2Expression);
|
||||
}
|
||||
else if (methodCallExpression.Arguments[0] is ConstantExpression constantExpression)
|
||||
{
|
||||
shardingValue = GetShardingKeyValue(constantExpression);
|
||||
}
|
||||
|
||||
if (!EqualityComparer<TKey>.Default.Equals(shardingValue, default))
|
||||
{
|
||||
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal);
|
||||
if (shardingValue != default)
|
||||
{
|
||||
return _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -326,18 +349,32 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
{
|
||||
//条件在右边
|
||||
bool conditionOnRight = false;
|
||||
TKey value = default;
|
||||
string shardingPropertyName = null;
|
||||
object value = default;
|
||||
|
||||
if (IsShardingKey(binaryExpression.Left) && IsConstantOrMember(binaryExpression.Right))
|
||||
if (IsConstantOrMember(binaryExpression.Right))
|
||||
{
|
||||
conditionOnRight = true;
|
||||
|
||||
value = GetShardingKeyValue(binaryExpression.Right);
|
||||
var shardingPredicateResult = IsShardingKey(binaryExpression.Left);
|
||||
if (shardingPredicateResult.IsShardingKey)
|
||||
{
|
||||
conditionOnRight = true;
|
||||
shardingPropertyName = shardingPredicateResult.ShardingPropertyName;
|
||||
value = GetShardingKeyValue(binaryExpression.Right);
|
||||
}
|
||||
else
|
||||
return x => true;
|
||||
}
|
||||
else if (IsConstantOrMember(binaryExpression.Left) && IsShardingKey(binaryExpression.Right))
|
||||
else if (IsConstantOrMember(binaryExpression.Left))
|
||||
{
|
||||
conditionOnRight = false;
|
||||
value = GetShardingKeyValue(binaryExpression.Left);
|
||||
var shardingPredicateResult = IsShardingKey(binaryExpression.Right);
|
||||
if (shardingPredicateResult.IsShardingKey)
|
||||
{
|
||||
conditionOnRight = false;
|
||||
shardingPropertyName = shardingPredicateResult.ShardingPropertyName;
|
||||
value = GetShardingKeyValue(binaryExpression.Left);
|
||||
}
|
||||
else
|
||||
return x => true;
|
||||
}
|
||||
else
|
||||
return x => true;
|
||||
|
@ -353,12 +390,31 @@ namespace ShardingCore.Core.Internal.Visitors
|
|||
_ => ShardingOperatorEnum.UnKnown
|
||||
};
|
||||
|
||||
if (EqualityComparer<TKey>.Default.Equals(value, default))
|
||||
if (shardingPropertyName == null || value == default)
|
||||
return x => true;
|
||||
|
||||
|
||||
return _keyToTailWithFilter(value, op);
|
||||
return _keyToTailWithFilter(value, op, shardingPropertyName);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 分片条件结果
|
||||
/// </summary>
|
||||
internal class ShardingPredicateResult
|
||||
{
|
||||
public ShardingPredicateResult(bool isShardingKey, string shardingPropertyName)
|
||||
{
|
||||
IsShardingKey = isShardingKey;
|
||||
ShardingPropertyName = shardingPropertyName;
|
||||
}
|
||||
/// <summary>
|
||||
/// 是否是分片字段
|
||||
/// </summary>
|
||||
public bool IsShardingKey { get; }
|
||||
/// <summary>
|
||||
/// 分片字段名称
|
||||
/// </summary>
|
||||
public string ShardingPropertyName { get; }
|
||||
}
|
||||
}
|
|
@ -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="shardingTableRoute">sharding table or data source</param>
|
||||
/// <returns></returns>
|
||||
public static Expression<Func<string, bool>> GetRouteParseExpression<TKey>(IQueryable queryable, EntityMetadata entityMetadata, Func<TKey, ShardingOperatorEnum, Expression<Func<string, bool>>> keyToTailExpression,bool shardingTableRoute)
|
||||
public static Expression<Func<string, bool>> GetRouteParseExpression(IQueryable queryable, EntityMetadata entityMetadata, Func<object, ShardingOperatorEnum,string, Expression<Func<string, bool>>> keyToTailExpression,bool shardingTableRoute)
|
||||
{
|
||||
|
||||
QueryableRouteShardingTableDiscoverVisitor<TKey> visitor = new QueryableRouteShardingTableDiscoverVisitor<TKey>(entityMetadata, keyToTailExpression, shardingTableRoute);
|
||||
QueryableRouteShardingTableDiscoverVisitor visitor = new QueryableRouteShardingTableDiscoverVisitor(entityMetadata, keyToTailExpression, shardingTableRoute);
|
||||
|
||||
visitor.Visit(queryable.Expression);
|
||||
|
||||
return visitor.GetRouteParseExpression();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取本次查询的所有涉及到的对象
|
||||
/// </summary>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using ShardingCore.Extensions;
|
||||
|
||||
namespace ShardingCore.VirtualRoutes.Abstractions
|
||||
{
|
||||
|
|
|
@ -49,9 +49,8 @@ namespace ShardingCore.VirtualRoutes.Days
|
|||
return $"{time:yyyyMMdd}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
{
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Days
|
|||
return $"{dateTime:yyyyMMdd}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -48,7 +48,7 @@ namespace ShardingCore.VirtualRoutes.Mods
|
|||
return Enumerable.Range(0, Mod).Select(o => o.ToString().PadLeft(TailLength, PaddingChar)).ToList();
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
|
||||
var t = ShardingKeyToTail(shardingKey);
|
||||
|
|
|
@ -65,7 +65,7 @@ namespace ShardingCore.VirtualRoutes.Mods
|
|||
/// <param name="shardingKey"></param>
|
||||
/// <param name="shardingOperator"></param>
|
||||
/// <returns></returns>
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = ShardingKeyToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -39,7 +39,7 @@ namespace ShardingCore.VirtualRoutes.Months
|
|||
return $"{time:yyyyMM}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Months
|
|||
var datetime = ShardingCoreHelper.ConvertLongToDateTime(time);
|
||||
return $"{datetime:yyyyMM}";
|
||||
}
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace ShardingCore.VirtualRoutes.Weeks
|
|||
return $"{currentMonday:yyyyMM}{currentMonday:dd}_{currentSunday:dd}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace ShardingCore.VirtualRoutes.Weeks
|
|||
return $"{currentMonday:yyyyMM}{currentMonday:dd}_{currentSunday:dd}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -37,7 +37,7 @@ namespace ShardingCore.VirtualRoutes.Years
|
|||
{
|
||||
return $"{time:yyyy}";
|
||||
}
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -60,7 +60,7 @@ namespace ShardingCore.VirtualRoutes.Years
|
|||
/// <param name="shardingKey"></param>
|
||||
/// <param name="shardingOperator"></param>
|
||||
/// <returns>当传入表后缀你告诉框架这个后缀是否需要被返回,分片字段如何筛选出后缀</returns>
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -85,30 +85,30 @@ namespace ShardingCore.Test
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
var xxxx = "202102";
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -64,30 +64,30 @@ namespace ShardingCore.Test
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -46,7 +46,7 @@ namespace ShardingCore.Test.Shardings
|
|||
return $"{dateOfMonth:yyyyMM}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -73,30 +73,30 @@ namespace ShardingCore.Test2x
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -63,30 +63,30 @@ namespace ShardingCore.Test2x
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace ShardingCore.Test2x.Shardings
|
|||
return $"{dateOfMonth:yyyyMM}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -73,30 +73,30 @@ namespace ShardingCore.Test3x
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -64,30 +64,30 @@ namespace ShardingCore.Test3x
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -46,7 +46,7 @@ namespace ShardingCore.Test3x.Shardings
|
|||
return $"{dateOfMonth:yyyyMM}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
|
@ -73,30 +73,30 @@ namespace ShardingCore.Test5x
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op, propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -65,30 +65,30 @@ namespace ShardingCore.Test5x
|
|||
var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute<SysUserSalary, int>)virtualTable.GetVirtualRoute();
|
||||
|
||||
var queryable1 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202102);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression<int>(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable2 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= 202102);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression<int>(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var xxxx1 = 202102;
|
||||
var queryable3 = _virtualDbContext.Set<SysUserSalary>().Where(ox => ox.DateOfMonth >= xxxx1);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression<int>(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable4 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth >= 202101);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression<int>(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable5 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth > 202101);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression<int>(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable6 = _virtualDbContext.Set<SysUserSalary>().Where(o => o.DateOfMonth == 202101);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression<int>(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable7 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 <= o.DateOfMonth);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression<int>(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
var queryable8 = _virtualDbContext.Set<SysUserSalary>().Where(o => 202101 == o.DateOfMonth);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression<int>(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op) => virtualTableRoute.GetRouteToFilter(i, op), true);
|
||||
var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata,
|
||||
(i, op,propertyName) => virtualTableRoute.GetRouteToFilter(i, op,propertyName), true);
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2));
|
||||
Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3));
|
||||
Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace ShardingCore.Test5x.Shardings
|
|||
return $"{dateOfMonth:yyyyMM}";
|
||||
}
|
||||
|
||||
public override Expression<Func<string, bool>> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
public override Expression<Func<string, bool>> GetMainRouteFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
|
|
Loading…
Reference in New Issue