コード例 #1
0
        /// <summary>
        /// 下级调拨单汇总
        /// </summary>
        public static DataTable AggregateSubordinateCannibalize(CompositeFilterDescriptorCollection filters)
        {
            var lp   = _query.LinqOP;
            var oids = OrganizationListVM.CurrentOrganization.ChildrenOrganizations.Select(o => o.ID).ToArray();
            var cannibalizeContext = lp.Search <BillCannibalize>(o => oids.Contains(o.ToOrganizationID) && oids.Contains(o.OrganizationID));
            var detailsContext     = lp.GetDataContext <BillCannibalizeDetails>();
            var productContext     = lp.GetDataContext <ViewProduct>();
            var brandIDs           = VMGlobal.PoweredBrands.Select(o => o.ID);

            FilterBillWithBrand(cannibalizeContext, filters, brandIDs);
            var data = from cannibalize in cannibalizeContext
                       from details in detailsContext
                       where cannibalize.ID == details.BillID
                       from product in productContext
                       where product.ProductID == details.ProductID //&& brandIDs.Contains(product.BrandID)
                       select new CannibalizeEntityForAggregation
            {
                OrganizationID   = cannibalize.OrganizationID,
                ToOrganizationID = cannibalize.ToOrganizationID,
                ProductID        = product.ProductID,
                BrandID          = product.BrandID,
                CreateTime       = cannibalize.CreateTime.Date,
                StyleCode        = product.StyleCode,
                Quantity         = details.Quantity,
                Status           = cannibalize.Status
            };

            data = (IQueryable <CannibalizeEntityForAggregation>)data.Where(filters);
            return(new BillReportHelper().TransferSizeToHorizontal <DistributionProductShow>(AggregateBill(data, false)));
        }
コード例 #2
0
        public static List <StoreMoveAggregationEntity> AggregateStoreMove(CompositeFilterDescriptorCollection filters)
        {
            var lp               = _query.LinqOP;
            var brandIDs         = VMGlobal.PoweredBrands.Select(o => o.ID);
            var storemoveContext = lp.Search <BillStoreMove>(o => o.OrganizationID == VMGlobal.CurrentUser.OrganizationID);

            FilterBillWithBrand(storemoveContext, filters, brandIDs);
            var detailsContext = lp.GetDataContext <BillStoreMoveDetails>();
            var productContext = lp.GetDataContext <ViewProduct>();
            var data           = from sm in storemoveContext
                                 from details in detailsContext
                                 where sm.ID == details.BillID
                                 from product in productContext
                                 where product.ProductID == details.ProductID //&& brandIDs.Contains(product.BrandID)
                                 select new StoreMoveEntityForAggregation
            {
                ID           = sm.ID,
                ProductID    = product.ProductID,
                BrandID      = product.BrandID,
                Code         = sm.Code,
                CreateTime   = sm.CreateTime.Date,
                StorageIDIn  = sm.StorageIDIn,
                StorageIDOut = sm.StorageIDOut,
                StyleCode    = product.StyleCode,
                Quantity     = details.Quantity
            };
            var filtedData = (IQueryable <StoreMoveEntityForAggregation>)data.Where(filters);
            var sum        = filtedData.GroupBy(o => new { o.ProductID, o.StorageIDOut, o.StorageIDIn }).Select(g => new
            {
                Key      = g.Key,
                Quantity = g.Sum(o => o.Quantity)
            }).ToList();
            var pids     = sum.Select(o => o.Key.ProductID).ToArray();
            var products = _query.LinqOP.Search <ViewProduct>(o => pids.Contains(o.ProductID)).ToList();
            var result   = sum.Select(o =>
            {
                var product = products.First(p => p.ProductID == o.Key.ProductID);
                return(new StoreMoveAggregationEntity
                {
                    BYQID = product.BYQID,
                    ProductID = product.ProductID,
                    ProductCode = product.ProductCode,
                    StyleCode = product.StyleCode,
                    ColorID = product.ColorID,
                    SizeID = product.SizeID,
                    Quantity = o.Quantity,
                    OutStorageName = Storages.Find(s => s.ID == o.Key.StorageIDOut).Name,
                    InStorageName = Storages.Find(s => s.ID == o.Key.StorageIDIn).Name
                });
            }).ToList();

            foreach (var r in result)
            {
                r.ColorCode = VMGlobal.Colors.Find(o => o.ID == r.ColorID).Code;
                r.BrandID   = VMGlobal.BYQs.Find(o => o.ID == r.BYQID).BrandID;
                r.BrandCode = VMGlobal.PoweredBrands.Find(o => o.ID == r.BrandID).Code;
                r.SizeName  = VMGlobal.Sizes.Find(o => o.ID == r.SizeID).Name;
            }
            return(result);
        }
コード例 #3
0
        /// <summary>
        /// 本级退货单汇总
        /// </summary>
        public static DataTable AggregateSelfGoodReturn(CompositeFilterDescriptorCollection filters)
        {
            var lp = _query.LinqOP;
            var goodReturnContext = lp.Search <BillGoodReturn>(o => o.OrganizationID == VMGlobal.CurrentUser.OrganizationID);
            var detailsContext    = lp.GetDataContext <BillGoodReturnDetails>();
            var productContext    = lp.GetDataContext <ViewProduct>();
            var brandIDs          = VMGlobal.PoweredBrands.Select(o => o.ID);

            FilterBillWithBrand(goodReturnContext, filters, brandIDs);
            var data = from goodreturn in goodReturnContext
                       from details in detailsContext
                       where goodreturn.ID == details.BillID
                       from product in productContext
                       where product.ProductID == details.ProductID //&& brandIDs.Contains(product.BrandID)
                       select new MultiStatusBillEntityForAggregation
            {
                StorageID  = goodreturn.StorageID,
                ProductID  = product.ProductID,
                BrandID    = product.BrandID,
                CreateTime = goodreturn.CreateTime.Date,
                StyleCode  = product.StyleCode,
                Quantity   = details.Quantity,
                Status     = goodreturn.Status
            };

            data = (IQueryable <MultiStatusBillEntityForAggregation>)data.Where(filters);
            return(new BillReportHelper().TransferSizeToHorizontal <DistributionProductShow>(AggregateBill(data)));
        }
コード例 #4
0
        /// <summary>
        /// 入库单明细
        /// </summary>
        //public static IList GetBillStoringDetails(int billID)
        //{
        //    var detailsContext = _query.LinqOP.Search<BillStoringDetails>(o => o.BillID == billID);
        //    var productContext = _query.LinqOP.GetDataContext<ViewProduct>();
        //    var data = from details in detailsContext
        //               from product in productContext
        //               where details.ProductID == product.ProductID
        //               select new ProductForBill
        //               {
        //                   ProductCode = product.ProductCode,
        //                   BrandCode = product.BrandCode,
        //                   StyleCode = product.StyleCode,
        //                   ColorCode = product.ColorCode,
        //                   SizeName = product.SizeName,
        //                   Price = product.Price,
        //                   Quantity = details.Quantity
        //               };
        //    return data.ToList();
        //}

        /// <summary>
        /// 入库汇总
        /// </summary>
        //public static DataTable AggregateStoring(CompositeFilterDescriptorCollection filters)
        //{
        //    var lp = _query.LinqOP;
        //    var storingContext = lp.GetDataContext<BillStoring>().Where(o => o.OrganizationID == VMGlobal.CurrentUser.OrganizationID);
        //    var storingDetailsContext = lp.GetDataContext<BillStoringDetails>();
        //    var productContext = lp.GetDataContext<ViewProduct>();
        //    //var storageContext = lp.GetDataContext<Storage>();

        //    var brandIDs = VMGlobal.PoweredBrands.Select(o => o.ID);
        //    FilterBillWithBrand(storingContext, filters, brandIDs);
        //    var data = from storing in storingContext
        //               from storingDetails in storingDetailsContext
        //               where storing.ID == storingDetails.BillID
        //               from product in productContext
        //               where product.ProductID == storingDetails.ProductID //&& brandIDs.Contains(product.BrandID)
        //               //from storage in storageContext
        //               //where storing.StorageID == storage.ID
        //               select new StoreOIEntityForAggregation
        //               {
        //                   ProductID = product.ProductID,
        //                   BrandID = product.BrandID,
        //                   StorageID = storing.StorageID,
        //                   CreateTime = storing.CreateTime.Date,
        //                   BillType = storing.BillType,
        //                   //ProductCode = product.ProductCode,
        //                   //BrandCode = product.BrandCode,
        //                   StyleCode = product.StyleCode,
        //                   //ColorCode = product.ColorCode,
        //                   //SizeName = product.SizeName,
        //                   //Price = product.Price,
        //                   NameID = product.NameID,
        //                   Quantity = storingDetails.Quantity
        //               };
        //    data = (IQueryable<StoreOIEntityForAggregation>)data.Where(filters);
        //    return new BillReportHelper().TransferSizeToHorizontal<DistributionProductForBrush>(AggregateBill(data));
        //}

        #endregion

        public static IEnumerable <DistributionEntity> GetOtherShopStock(CompositeFilterDescriptorCollection filters)
        {
            var lp             = _query.LinqOP;
            var shops          = OrganizationLogic.GetSiblingShops(VMGlobal.CurrentUser.OrganizationID);
            var oids           = shops.Where(o => o.ID != VMGlobal.CurrentUser.OrganizationID).Select(o => o.ID);
            var stockContext   = lp.GetDataContext <Stock>();
            var storageContext = lp.Search <Storage>(o => oids.Contains(o.OrganizationID) && o.Flag);
            var brandIDs       = VMGlobal.PoweredBrands.Select(o => o.ID);
            var productContext = lp.Search <ViewProduct>(o => brandIDs.Contains(o.BrandID));

            var data = from stock in stockContext
                       from storage in storageContext
                       where stock.StorageID == storage.ID && stock.Quantity != 0
                       from product in productContext
                       where stock.ProductID == product.ProductID
                       select new BillEntityForAggregation
            {
                OrganizationID = storage.OrganizationID,
                StyleCode      = product.StyleCode,
                BrandID        = product.BrandID,
                ProductID      = product.ProductID,
                Quantity       = stock.Quantity
            };
            var filtedData = (IQueryable <BillEntityForAggregation>)data.Where(filters);//即使filters中有data没有的过滤属性,也不会出错,但是会产生0<>0的恒为假条件
            var sum        = filtedData.GroupBy(o => new { o.ProductID, o.OrganizationID }).Select(g => new
            {
                Key      = g.Key,
                Quantity = g.Sum(o => o.Quantity)
            }).ToList();
            var pids     = sum.Select(o => o.Key.ProductID).ToArray();
            var products = lp.Search <ViewProduct>(o => pids.Contains(o.ProductID)).ToList();
            var result   = sum.Select(o =>
            {
                var product = products.First(p => p.ProductID == o.Key.ProductID);
                return(new DistributionEntity
                {
                    ProductID = product.ProductID,
                    ProductCode = product.ProductCode,
                    StyleCode = product.StyleCode,
                    BYQID = product.BYQID,
                    ColorID = product.ColorID,
                    SizeID = product.SizeID,
                    Quantity = o.Quantity,
                    OrganizationID = o.Key.OrganizationID,
                    OrganizationName = shops.Find(c => c.ID == o.Key.OrganizationID).Name
                });
            }).ToList();

            foreach (var r in result)
            {
                r.ColorCode = VMGlobal.Colors.Find(o => o.ID == r.ColorID).Code;
                r.SizeName  = VMGlobal.Sizes.Find(o => o.ID == r.SizeID).Name;
                var byq = VMGlobal.BYQs.Find(o => o.ID == r.BYQID);
                r.BrandID   = byq.BrandID;
                r.BrandCode = VMGlobal.PoweredBrands.Find(o => o.ID == r.BrandID).Code;
            }
            return(result);
            //return new BillReportHelper().TransferSizeToHorizontal<DistributionEntity>(result);
        }
コード例 #5
0
        public void AppendFilters(CompositeFilterDescriptorCollection filters)
        {
            FilterDescriptor fd_paisId = null;

            if (filters == null)
            {
                throw new ArgumentNullException();
            }
            if (this.paisId == -1)
            {
                return;
            }

            fd_paisId = new FilterDescriptor(PAIS_ID_ELEMENT, FilterOperator.IsEqualTo, this.paisId, false, typeof(int));

            // Verify this filter does not exist prior to adding it
            filters.Add(fd_paisId);
        }
コード例 #6
0
        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            if (cbxStorage.SelectedIndex == -1)
            {
                cbxStorage.Focus();
                MessageBox.Show("请选择盘点仓库");
                return;
            }
            var filters = new CompositeFilterDescriptorCollection();

            //filters.AddRange(billFilter.FilterDescriptors.ToList());
            filters.Add(billFilter.FilterDescriptors);
            int storageID = (int)cbxStorage.SelectedValue;

            filters.Add(new FilterDescriptor("StorageID", FilterOperator.IsEqualTo, cbxStorage.SelectedValue));
            filters.Add(new FilterDescriptor("Status", FilterOperator.IsEqualTo, false));

            var data   = ReportDataContext.AggregateStocktakeForStockUpdate(filters, out _refrenceStocktakeIDs);
            var pids   = data.Select(o => o.ProductID);
            var stocks = VMGlobal.DistributionQuery.LinqOP.Search <Stock>(o => o.StorageID == storageID && pids.Contains(o.ProductID)).ToList();
            var result = data.Select(o =>
            {
                var d = new StocktakeAggregationEntityForStockUpdate
                {
                    BrandID     = o.BrandID,
                    BrandCode   = o.BrandCode,
                    ColorCode   = o.ColorCode,
                    ProductCode = o.ProductCode,
                    ProductID   = o.ProductID,
                    Quantity    = o.Quantity,
                    SizeCode    = o.SizeCode,
                    SizeName    = o.SizeName,
                    StyleCode   = o.StyleCode
                };
                var stock       = stocks.FirstOrDefault(s => s.ProductID == o.ProductID);
                d.StockQuantity = (stock == null ? 0 : stock.Quantity);
                return(d);
            }).ToList();

            RadGridView1.ItemsSource = result;
        }
コード例 #7
0
        /// <summary>
        /// 获取零售业绩
        /// <remarks>不涉及品牌过滤</remarks>
        /// </summary>
        public static IEnumerable <RetailAchievementEntity> GetSelfRetailAchievement(CompositeFilterDescriptorCollection filters)
        {
            var lp            = _query.LinqOP;
            var retailContext = lp.Search <BillRetail>(o => o.OrganizationID == VMGlobal.CurrentUser.OrganizationID);

            retailContext = retailContext.Select(o => new BillRetail
            {
                CreateTime   = o.CreateTime.Date,
                CostMoney    = o.CostMoney,
                ReceiveMoney = o.ReceiveMoney,
                TicketMoney  = o.TicketMoney,
                Quantity     = o.Quantity
            });
            var data = (IQueryable <BillRetail>)retailContext.Where(filters);
            //return data.ToList();//CreateTime转换成Date之后虽然对filters有效,但获取的数据仍然是原来的带时分秒的CreateTime,只是在从数据库获取之后再转换为不带时分秒的Date值
            //目前groupby只能生成纯列名形式,如虽然是GroupBy(o => o.CreateTime.Date),但生成的sql语句仍然是groupby(CreateTime),而不是groupby(Convert(10,CreateTime,120))这种形式
            //var result = data.GroupBy(o => o.CreateTime).Select(g => new BillRetail
            //{
            //    CreateTime = g.Key,
            //    Quantity = g.Sum(o => o.Quantity),
            //    CostMoney = g.Sum(o => o.CostMoney),
            //    ReceiveMoney = g.Sum(o => o.ReceiveMoney),
            //    TicketMoney = g.Sum(o => o.TicketMoney)
            //}).ToList();
            //数据返回后再汇总可能会导致传输效率低下的问题
            var result = data.ToList().GroupBy(o => o.CreateTime).Select(g => new RetailAchievementEntity
            {
                CreateTime   = g.Key,
                Year         = g.Key.Year,
                YearMonth    = g.Key.ToString("yyyy-MM"),
                Quantity     = g.Sum(o => o.Quantity),
                CostMoney    = g.Sum(o => o.CostMoney),
                ReceiveMoney = g.Sum(o => o.ReceiveMoney),
                TicketMoney  = g.Sum(o => o.TicketMoney)
            }).OrderByDescending(o => o.CreateTime);;

            return(result);
        }
コード例 #8
0
        public static List <DistributionProductShow> AggregateStocktakeForStockUpdate(CompositeFilterDescriptorCollection filters, out List <int> refrenceStocktakeIDs)
        {
            var filtedData = GetStocktakeAggregation(filters);

            refrenceStocktakeIDs = filtedData.Select(o => o.ID).Distinct().ToList();
            return(AggregateBill(filtedData));
        }
コード例 #9
0
        public static DataTable AggregateStocktake(CompositeFilterDescriptorCollection filters)
        {
            var filtedData = GetStocktakeAggregation(filters);

            return(new BillReportHelper().TransferSizeToHorizontal <DistributionProductShow>(AggregateBill(filtedData)));
        }
コード例 #10
0
        private static IQueryable <StocktakeEntityForAggregation> GetStocktakeAggregation(CompositeFilterDescriptorCollection filters)
        {
            var lp               = _query.LinqOP;
            var brandIDs         = VMGlobal.PoweredBrands.Select(o => o.ID);
            var stocktakeContext = lp.Search <BillStocktake>(o => o.OrganizationID == VMGlobal.CurrentUser.OrganizationID && !o.IsDeleted);

            FilterBillWithBrand(stocktakeContext, filters, brandIDs);
            var detailsContext = lp.GetDataContext <BillStocktakeDetails>();
            var productContext = lp.GetDataContext <ViewProduct>();
            var data           = from st in stocktakeContext
                                 from details in detailsContext
                                 where st.ID == details.BillID
                                 from product in productContext
                                 where product.ProductID == details.ProductID //&& brandIDs.Contains(product.BrandID)
                                 select new StocktakeEntityForAggregation
            {
                ID         = st.ID,
                ProductID  = product.ProductID,
                BrandID    = product.BrandID,
                Code       = st.Code,
                CreateTime = st.CreateTime.Date,
                Status     = st.Status,
                StorageID  = st.StorageID,
                StyleCode  = product.StyleCode,
                Quantity   = details.Quantity
            };

            return((IQueryable <StocktakeEntityForAggregation>)data.Where(filters));
        }
コード例 #11
0
ファイル: FilterExtensions.cs プロジェクト: mparsin/Elements
        /// <summary>
        /// Get FilterDescriptorCollection from Expression
        /// </summary>
        /// <param name="filterExpression">Expression</param>
        /// <param name="radDataFilter">The RAD data filter.</param>
        /// <returns>CompositeFilterDescriptorCollection</returns>
        public static CompositeFilterDescriptorCollection GetFilterDescriptorCollection(this string filterExpression, RadDataFilter radDataFilter)
        {
            var descriptor = Veyron.SharedTypes.FilterDescriptor.FromJSON(filterExpression);
            var result = new CompositeFilterDescriptorCollection { LogicalOperator = descriptor.LogicalOperator.ToRadLogicalOperator() };

            if (descriptor.FilterDescriptors == null || descriptor.FilterDescriptors.Count == 0)
            {
                if (descriptor.Operator != FilterOperator.Any)
                {
                    result.Add(GetRadFilterDescriptor(descriptor, radDataFilter));
                }
            }
            else
            {
                CompositeFilterDescriptor(descriptor, result, radDataFilter);
            }

            return result;
        }
コード例 #12
0
ファイル: FilterExtensions.cs プロジェクト: mparsin/Elements
        /// <summary>
        /// Get FilterDescriptorCollection from Expression.
        /// </summary>
        /// <param name="filterDescriptor">Filter Descriptor.</param>
        /// <param name="radDataFilter">The RAD data filter.</param>
        /// <returns>CompositeFilterDescriptorCollection.</returns>
        public static CompositeFilterDescriptorCollection GetFilterDescriptorCollection(this Veyron.SharedTypes.IFilterDescriptor filterDescriptor, RadDataFilter radDataFilter)
        {
            if (filterDescriptor == null)
                return null;

            var result = new CompositeFilterDescriptorCollection { LogicalOperator = filterDescriptor.LogicalOperator.ToRadLogicalOperator() };

            if (filterDescriptor.FilterDescriptors == null || filterDescriptor.FilterDescriptors.Count == 0)
            {
                if (filterDescriptor.Operator != FilterOperator.Any)
                    result.Add(GetRadFilterDescriptor(filterDescriptor, radDataFilter));
            }
            else
                CompositeFilterDescriptor(filterDescriptor, result, radDataFilter);

            return result;
        }
コード例 #13
0
        /// <summary>
        /// 下级调拨单分布
        /// </summary>
        public static List <CannibalizeDistributionEntity> GetSubordinateCannibalizeDistribution(CompositeFilterDescriptorCollection filters)
        {
            var lp = _query.LinqOP;
            var childOrganizations = OrganizationListVM.CurrentOrganization.ChildrenOrganizations;
            var oids = childOrganizations.Select(o => o.ID).ToArray();
            var cannibalizeContext = lp.Search <BillCannibalize>(o => oids.Contains(o.ToOrganizationID) && oids.Contains(o.OrganizationID));
            var detailsContext     = lp.GetDataContext <BillCannibalizeDetails>();
            var productContext     = lp.GetDataContext <ViewProduct>();
            var brandIDs           = VMGlobal.PoweredBrands.Select(o => o.ID);

            FilterBillWithBrand(cannibalizeContext, filters, brandIDs);
            var data = from cannibalize in cannibalizeContext
                       from details in detailsContext
                       where cannibalize.ID == details.BillID
                       from product in productContext
                       where product.ProductID == details.ProductID //&& brandIDs.Contains(product.BrandID)
                       select new CannibalizeEntityForAggregation
            {
                OrganizationID   = cannibalize.OrganizationID,
                ToOrganizationID = cannibalize.ToOrganizationID,
                ProductID        = product.ProductID,
                BrandID          = product.BrandID,
                CreateTime       = cannibalize.CreateTime.Date,
                StyleCode        = product.StyleCode,
                Quantity         = details.Quantity,
                Status           = cannibalize.Status
            };
            var filtedData = (IQueryable <CannibalizeEntityForAggregation>)data.Where(filters);
            var sum        = filtedData.GroupBy(o => new { o.ProductID, o.OrganizationID, o.ToOrganizationID }).Select(g => new
            {
                Key      = g.Key,
                Quantity = g.Sum(o => o.Quantity)
            }).ToList();
            var pids     = sum.Select(o => o.Key.ProductID).ToArray();
            var products = lp.Search <ViewProduct>(o => pids.Contains(o.ProductID)).ToList();
            var result   = sum.Select(o =>
            {
                var product = products.First(p => p.ProductID == o.Key.ProductID);
                return(new CannibalizeDistributionEntity
                {
                    BYQID = product.BYQID,
                    ProductID = product.ProductID,
                    ProductCode = product.ProductCode,
                    StyleCode = product.StyleCode,
                    ColorID = product.ColorID,
                    SizeID = product.SizeID,
                    Quantity = o.Quantity,
                    OutOrganizationName = childOrganizations.Find(s => s.ID == o.Key.OrganizationID).Name,
                    InOrganizationName = childOrganizations.Find(s => s.ID == o.Key.ToOrganizationID).Name
                });
            }).ToList();

            foreach (var r in result)
            {
                r.ColorCode = VMGlobal.Colors.Find(o => o.ID == r.ColorID).Code;
                r.SizeName  = VMGlobal.Sizes.Find(o => o.ID == r.SizeID).Name;
                var byq = VMGlobal.BYQs.Find(o => o.ID == r.BYQID);
                r.BrandID   = byq.BrandID;
                r.BrandCode = VMGlobal.PoweredBrands.Find(o => o.ID == r.BrandID).Code;
            }
            return(result);
        }
コード例 #14
0
 private static void FilterBillWithBrand <TBill>(IQueryable <TBill> billContext, CompositeFilterDescriptorCollection condition, IEnumerable <int> brandIDs) where TBill : BillWithBrand
 {
     //if (!FilterConditionHelper.IsConditionSetted(condition, "BrandID"))
     billContext = billContext.Where(o => brandIDs.Contains(o.BrandID));
 }
コード例 #15
0
        public static List <ContrastDetailsSearchEntity> AggregateSubordinateStocktakeContrast(CompositeFilterDescriptorCollection filters)
        {
            var lp = _query.LinqOP;
            var childOrganizations = OrganizationListVM.CurrentOrganization.ChildrenOrganizations;
            var oids            = childOrganizations.Select(o => o.ID);
            var contrastContext = lp.Search <BillStocktakeContrast>(o => oids.Contains(o.OrganizationID));
            var brandIDs        = VMGlobal.PoweredBrands.Select(o => o.ID);

            FilterBillWithBrand(contrastContext, filters, brandIDs);
            var detailsContext = lp.GetDataContext <BillStocktakeContrastDetails>();
            var productContext = lp.GetDataContext <ViewProduct>();
            var data           = from st in contrastContext
                                 from details in detailsContext
                                 where st.ID == details.BillID
                                 from product in productContext
                                 where product.ProductID == details.ProductID //&& brandIDs.Contains(product.BrandID)
                                 select new ContrastEntityForAggregation
            {
                ID             = st.ID,
                ProductID      = product.ProductID,
                BrandID        = product.BrandID,
                Code           = st.Code,
                CreateTime     = st.CreateTime.Date,
                StyleCode      = product.StyleCode,
                Quantity       = details.Quantity,
                QuaStocktake   = details.QuaStocktake,
                QuaStockOrig   = details.QuaStockOrig,
                OrganizationID = st.OrganizationID
            };
            var filtedData = (IQueryable <ContrastEntityForAggregation>)data.Where(filters);
            var sum        = filtedData.GroupBy(o => o.ProductID).Select(g => new
            {
                ProductID    = g.Key,
                Quantity     = g.Sum(o => o.Quantity),
                QuaStocktake = g.Sum(o => o.QuaStocktake),
                QuaStockOrig = g.Sum(o => o.QuaStockOrig),
                QuaContrast  = g.Sum(o => Math.Abs(o.QuaStocktake - o.QuaStockOrig))
            }).ToList();
            var pids     = sum.Select(o => o.ProductID).ToArray();
            var products = _query.LinqOP.Search <ViewProduct>(o => pids.Contains(o.ProductID)).ToList();
            var result   = sum.Select(o =>
            {
                var product = products.First(p => p.ProductID == o.ProductID);
                return(new ContrastDetailsSearchEntity
                {
                    ProductID = product.ProductID,
                    ProductCode = product.ProductCode,
                    StyleCode = product.StyleCode,
                    BYQID = product.BYQID,
                    ColorID = product.ColorID,
                    SizeID = product.SizeID,
                    Quantity = o.Quantity,
                    QuaStocktake = o.QuaStocktake,
                    QuaStockOrig = o.QuaStockOrig,
                    QuaContrast = o.QuaContrast
                });
            }).ToList();

            foreach (var r in result)
            {
                r.ColorCode = VMGlobal.Colors.Find(o => o.ID == r.ColorID).Code;
                r.SizeName  = VMGlobal.Sizes.Find(o => o.ID == r.SizeID).Name;
                var byq = VMGlobal.BYQs.Find(o => o.ID == r.BYQID);
                r.BrandID   = byq.BrandID;
                r.BrandCode = VMGlobal.PoweredBrands.Find(o => o.ID == r.BrandID).Code;
            }
            return(result);
        }