예제 #1
0
            public int Compare(T x, T y)
            {
                for (int i = 0; i < getters.Length; i++)
                {
                    var getter = getters[i];
                    var xVal   = getter(x);
                    var yVal   = getter(y);
                    var cmp    = CompareTypeUtils.CompareTo(xVal, yVal);
                    if (cmp != 0)
                    {
                        return(orderAsc[i] ? cmp : cmp * -1);
                    }
                }

                return(0);
            }
 public virtual int CompareTo(object a, object b)
 {
     return(CompareTypeUtils.CompareTo(a, b));
 }
예제 #3
0
        public virtual object SelectAggregate(IDataQuery q, string name, IEnumerable <string> args)
        {
            name = name?.ToUpper() ?? throw new ArgumentNullException(nameof(name));

            if (name != "COUNT" && name != "MIN" && name != "MAX" && name != "AVG" && name != "SUM" &&
                name != "FIRST" && name != "LAST")
            {
                return(null);
            }

            var query = (DataQuery <T>)q;

            var    argsArray = args.ToArray();
            var    firstArg  = argsArray.FirstOrDefault();
            string modifier  = null;

            if (firstArg != null && firstArg.StartsWithIgnoreCase("DISTINCT "))
            {
                modifier = "DISTINCT";
                firstArg = firstArg.Substring(modifier.Length + 1);
            }

            if (name == "COUNT" && (firstArg == null || firstArg == "*"))
            {
                return(Count(q));
            }

            var firstGetter = TypeProperties <T> .Instance.GetPublicGetter(firstArg);

            if (firstGetter == null)
            {
                return(null);
            }

            var data = ApplyConditions(GetDataSource(q), query.Conditions);

            if (name == "FIRST" || name == "LAST")
            {
                data = ApplySorting(data, q.OrderBy);
            }

            var source = data.ToArray();

            switch (name)
            {
            case "COUNT":
                if (modifier == "DISTINCT")
                {
                    var results = new HashSet <object>();
                    foreach (var item in source)
                    {
                        results.Add(firstGetter(item));
                    }
                    return(results.Count);
                }

                return(CompareTypeUtils.Aggregate(source,
                                                  (acc, next) => CompareTypeUtils.Add(acc, firstGetter(next)), 0));

            case "MIN":
                return(CompareTypeUtils.Aggregate(source,
                                                  (acc, next) => CompareTypeUtils.Min(acc, firstGetter(next))));

            case "MAX":
                return(CompareTypeUtils.Aggregate(source,
                                                  (acc, next) => CompareTypeUtils.Max(acc, firstGetter(next))));

            case "SUM":
                return(CompareTypeUtils.Sum(source.Map(x => firstGetter(x))));

            case "AVG":
                object sum       = CompareTypeUtils.Sum(source.Map(x => firstGetter(x)));
                var    sumDouble = (double)Convert.ChangeType(sum, typeof(double));
                return(sumDouble / source.Length);

            case "FIRST":
                return(source.Length > 0 ? firstGetter(source[0]) : null);

            case "LAST":
                return(source.Length > 0 ? firstGetter(source[source.Length - 1]) : null);
            }

            return(null);
        }