public void SaveSorting(ProductOption option, List <ProductOptionValueSortingData> sortingInfo)
        {
            IList <ProductOptionValueSort> productOptionValueSorts = GetProductOptionValueSorts(option);

            _session.Transact(session =>
            {
                foreach (ProductOptionValueSortingData data in sortingInfo)
                {
                    ProductOptionValueSort existingSort =
                        productOptionValueSorts.FirstOrDefault(sort => sort.Value == data.Value);
                    if (existingSort != null)
                    {
                        existingSort.DisplayOrder = data.DisplayOrder;
                        session.Update(existingSort);
                        continue;
                    }
                    existingSort = new ProductOptionValueSort
                    {
                        ProductOption = option,
                        DisplayOrder  = data.DisplayOrder,
                        Value         = data.Value
                    };
                    session.Save(existingSort);
                }
            });
        }
        public List <ProductOptionValueSortingData> GetOptions(ProductOption productOption)
        {
            ProductOption             productOptionAlias  = null;
            List <ProductOptionValue> productOptionValues = _session.QueryOver <ProductOptionValue>()
                                                            .JoinAlias(value => value.ProductOption, () => productOptionAlias)
                                                            .Where(() => productOptionAlias.Id == productOption.Id)
                                                            .Cacheable().List().DistinctBy(value => value.Value).ToList();

            IList <ProductOptionValueSort> productOptionValueSorts = GetProductOptionValueSorts(productOption);

            return(productOptionValues
                   .Select(value =>
            {
                ProductOptionValueSort order =
                    productOptionValueSorts.FirstOrDefault(sort => sort.Value == value.Value);
                return new ProductOptionValueSortingData
                {
                    Value = value.Value,
                    DisplayOrder = order == null ? productOptionValues.Count() : order.DisplayOrder
                };
            }).OrderBy(data => data.DisplayOrder).ThenBy(data => data.Value).ToList());
        }