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);
            }
            }
        }
示例#3
0
 /// <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);
        }
示例#5
0
        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);
            }
        }