예제 #1
0
        /// <summary>Searches the table for rows with given field value combinations.</summary>
        /// <param name="search">The search to run.</param>
        /// <param name="option">Options for the search and the result set.</param>
        /// <returns>Returns number of rows found.</returns>
        protected internal virtual long SqlCount(SqlSearch search, ResultOption option)
        {
            if (search is null)
            {
                throw new ArgumentNullException(nameof(search));
            }

            if (option is null)
            {
                throw new ArgumentNullException(nameof(option));
            }

            if (option.Contains(ResultOptionMode.Group))
            {
                return(SqlCountGroupBy(search, option));
            }

            var command = new StringBuilder();

            command.Append("SELECT COUNT(*) FROM ");
            command.Append(FQTN);
            command.Append(" WHERE ");
            command.Append(search);
            foreach (var o in option.ToArray())
            {
                switch (o.Mode)
                {
                case ResultOptionMode.SortAsc:
                case ResultOptionMode.SortDesc:
                case ResultOptionMode.None:
                    break;

                default:
                    throw new InvalidOperationException($"ResultOptionMode {o.Mode} not supported!");
                }
            }

            var value = Storage.QueryValue(new SqlCmd(command.ToString(), search.Parameters.ToArray()));

            if (value == null)
            {
                throw new InvalidDataException($"Could not read value from {FQTN}!");
            }

            return(Convert.ToInt64(value));
        }