protected override Expression <Func <string, bool> > GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) { var t = TimeFormatToTail(shardingKey); switch (shardingOperator) { case ShardingOperatorEnum.GreaterThan: case ShardingOperatorEnum.GreaterThanOrEqual: return(tail => String.Compare(tail, t, StringComparison.Ordinal) >= 0); case ShardingOperatorEnum.LessThan: { var currentYear = new DateTime(shardingKey.Year); //处于临界值 o=>o.time < [2021-01-01 00:00:00] 尾巴20210101不应该被返回 if (currentYear == shardingKey) { return(tail => String.Compare(tail, t, StringComparison.Ordinal) < 0); } return(tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0); } case ShardingOperatorEnum.LessThanOrEqual: return(tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0); case ShardingOperatorEnum.Equal: return(tail => tail == t); default: { #if DEBUG Console.WriteLine($"shardingOperator is not equal scan all table tail"); #endif return(tail => true); } } }
protected override Expression <Func <string, bool> > GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) { var t = ShardingKeyToTail(shardingKey); switch (shardingOperator) { case ShardingOperatorEnum.Equal: return(tail => tail == t); default: { #if DEBUG Console.WriteLine($"shardingOperator is not equal scan all table tail"); #endif return(tail => true); } } }
/// <summary> /// 如何路由到具体表 shardingKeyValue:分表的值, 返回结果:如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表 /// </summary> /// <param name="shardingKey">分表的值</param> /// <param name="shardingOperator">操作</param> /// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns> protected abstract Expression <Func <string, bool> > GetRouteToFilter(TKey shardingKey, ShardingOperatorEnum shardingOperator);
/// <summary> /// 如何路由到具体表 shardingKeyValue:分表的值,operate where的操作值 返回结果:如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表 /// </summary> /// <param name="shardingKeyValue">分表的值</param> /// <param name="operate">分表where操作类型</param> /// <returns>如果返回true表示返回该表 第一个参数 tail 第二参数是否返回该物理表</returns> protected override Expression <Func <string, bool> > GetRouteToFilter(TKey shardingKeyValue, ShardingOperatorEnum operate) { if (operate == ShardingOperatorEnum.Equal) { return(GetRouteEqualToFilter(shardingKeyValue)); } return(s => true); }
protected override Expression <Func <string, bool> > GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator) { var t = TimeFormatToTail(shardingKey); switch (shardingOperator) { case ShardingOperatorEnum.GreaterThan: case ShardingOperatorEnum.GreaterThanOrEqual: return(tail => String.Compare(tail, t, StringComparison.Ordinal) >= 0); case ShardingOperatorEnum.LessThan: return(tail => String.Compare(tail, t, StringComparison.Ordinal) < 0); case ShardingOperatorEnum.LessThanOrEqual: return(tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0); case ShardingOperatorEnum.Equal: return(tail => tail == t); default: { #if DEBUG Console.WriteLine($"shardingOperator is not equal scan all table tail"); #endif return(tail => true); } } }
protected override Expression <Func <string, bool> > GetRouteToFilter(long shardingKeyValue, ShardingOperatorEnum operate) { switch (operate) { case ShardingOperatorEnum.NotSupport: return(tail => true); //throw new NotSupportedException(xxxx); break; case ShardingOperatorEnum.GreaterThan: case ShardingOperatorEnum.GreaterThanOrEqual: //yyyyMMdd return(tail => int.Parse(tail) >= int.Parse(shardingKeyValue.ConvertLongToTime().ToString("yyyyMMdd"))); break; case ShardingOperatorEnum.LessThan: case ShardingOperatorEnum.LessThanOrEqual: //yyyyMMdd return(tail => int.Parse(tail) <= int.Parse(shardingKeyValue.ConvertLongToTime().ToString("yyyyMMdd"))); break; case ShardingOperatorEnum.Equal: //yyyyMMdd return(tail => int.Parse(tail) == int.Parse(shardingKeyValue.ConvertLongToTime().ToString("yyyyMMdd"))); break; case ShardingOperatorEnum.NotEqual: //yyyyMMdd return(tail => int.Parse(tail) != int.Parse(shardingKeyValue.ConvertLongToTime().ToString("yyyyMMdd"))); break; default: throw new ArgumentOutOfRangeException(nameof(operate), operate, null); } }