/// <summary> /// 根据套餐状态标签分页获取定制套餐列表 /// </summary> /// <param name="keywords">关键字</param> /// <param name="status">套餐状态</param> /// <param name="labels">套餐标签</param> /// <param name="sort">排序条件 false为倒序</param> /// <param name="pageIndex">页码</param> /// <param name="pageSize">页容量</param> /// <param name="rowCount">总记录条数</param> /// <param name="pageCount">总页数</param> /// <returns>定制套餐列表</returns> public IEnumerable <BalePack> FindCustPackByPage(string keywords, ShelfStatus?status, IList <string> labels, Dictionary <string, bool> sort, int pageIndex, int pageSize, out int rowCount, out int pageCount) { #region 标签处理 IQueryable <BalePack> balePacks = base.FindAllInner(); if (labels != null && labels.Any()) { PredicateBuilder <BalePack> builder = new PredicateBuilder <BalePack>(s => false); foreach (string label in labels) { string slabel = label; builder.Or(s => s.LabelStr.Contains(slabel)); } balePacks = balePacks.Where(builder.Build()); } #endregion Expression <Func <BalePack, bool> > condition = s => (string.IsNullOrEmpty(keywords) || s.Keywords.Contains(keywords)) && (status == null || s.PackShelfStatus == status) && s.BalePackType == BalePackType.Customized && s.SourcePackId == null; balePacks = balePacks.Where(condition); //排序 if (sort != null && sort.Any()) { balePacks = balePacks.OrderBy(sort); } rowCount = balePacks.Count(); pageCount = (int)Math.Ceiling(rowCount * 1.0 / pageSize); return(balePacks.Skip((pageIndex - 1) * pageSize).Take(pageSize)); //return balePacks.ToPage(s => true, pageIndex, pageSize, out rowCount, out pageCount); }
public void ShouldCombineExpressionsCorrectly_And(bool left, bool right, bool expected) { PredicateBuilder <object> builder = new PredicateBuilder <object>(_ => left).And(_ => right); Expression <Func <object, bool> > expression = builder.Build(); bool result = expression.Compile().Invoke(new object()); result.Should().Be(expected); }
public void ShouldNotUseDefaultFallback_False_Or() { PredicateBuilder <object> builder = new PredicateBuilder <object>(true).Or(_ => false); Expression <Func <object, bool> > expression = builder.Build(); bool result = expression.Compile().Invoke(new object()); result.Should().BeFalse(); }
public void ShouldBuildAndConvertToTheSameExpression() { var builder = new PredicateBuilder <object>(_ => true); Expression <Func <object, bool> > expression1 = builder; Expression <Func <object, bool> > expression2 = builder.Build(); expression1.Should().Be(expression2); }
public virtual IQueryable <T> ApplyFilters(IQueryable <T> query) { if (PredicateBuilder != null) { var @where = PredicateBuilder.Build(); if (@where != null) { query = query.Where(@where); } } return(query); }
public void TestBuildExpression() { //初始化 DbSession dbSession = new DbSession(); string[] keywords = { "张三", "李四", "王五" }; //动态拼接 PredicateBuilder <Student> builder = new PredicateBuilder <Student>(x => false); foreach (string keyword in keywords) { if (!string.IsNullOrEmpty(keyword)) { builder.Or(x => x.Name.Contains(keyword)); } } IQueryable <Student> specStudents = dbSession.Set <Student>().Where(builder.Build()); Assert.IsNotNull(specStudents.Any()); }
private void GetFilterList() { try { IEnumerable retrievedData = (IEnumerable)HttpContext.Current.Session[SessionVarName]; CustomList <BaseItem> retrievedDataList = retrievedData.ToCustomList <BaseItem>(); String expression = String.Empty; foreach (String colName in HttpContext.Current.Request.QueryString) { if (colName != "SessionVarName" && colName != "rows" && colName != "page" && colName != "sidx" && colName != "sord" && colName != "_search" && colName != "nd" && colName != "nd_" && colName != "id" && colName != "AggregateColumn" && colName != "FooterRowCaption") { String colValue = HttpContext.Current.Request.QueryString[colName]; if (!String.IsNullOrEmpty(expression)) { expression += " And "; } // expression += MakePredicateString(colName, colValue); } } if (!String.IsNullOrEmpty(expression)) { retrievedDataList = retrievedDataList.FindAll(PredicateBuilder.Build <BaseItem>(expression)); } // PerformRequestData(retrievedDataList); } catch (Exception ex) { throw ex; } }
/// <summary> /// 分页获取套餐模板列表(排除克隆版本套餐) /// </summary> /// <param name="keywords">关键字</param> /// <param name="propertyId">楼盘Id</param> /// <param name="applicableSquare">适用面积</param> /// <param name="isNewHouse">是否适用新房</param> /// <param name="isBuildingPrice">是否是建筑价格搜索</param> /// <param name="minPrice">最小价格</param> /// <param name="maxPrice">最大价格</param> /// <param name="isBuildingSquare">是否是建筑面积搜索</param> /// <param name="minSquare">最小面积</param> /// <param name="maxSquare">最大面积</param> /// <param name="hasOffSku">是否有下架商品</param> /// <param name="hasChangedSku">是否有变价商品|工艺</param> /// <param name="color">颜色</param> /// <param name="packType">套餐类型</param> /// <param name="packKind">套餐类别</param> /// <param name="packMode">套餐模式</param> /// <param name="status">状态</param> /// <param name="spaceTypes">空间类型集</param> /// <param name="styleNos">设计风格集</param> /// <param name="layouts">居室集</param> /// <param name="propertys">楼盘集</param> /// <param name="hasPackSeries"></param> /// <param name="packSeriesIds">套餐系列集</param> /// <param name="stores">门店集</param> /// <param name="hasStores">是否有门店(全部,标签:true,其他:false)</param> /// <param name="createrId">套餐创建人Id?(全部:null,我的:当前登录人员)</param> /// <param name="sort">排序条件 false为倒序</param> /// <param name="pageIndex">页码</param> /// <param name="pageSize">页容量</param> /// <param name="rowCount">总记录条数</param> /// <param name="pageCount">总页数</param> /// <returns>套餐模板列表</returns> public IEnumerable <DecorationPack> FindByPage(string keywords, Guid?propertyId, float?applicableSquare, bool?isNewHouse, bool?isBuildingPrice, decimal?minPrice, decimal?maxPrice, bool?isBuildingSquare, float?minSquare, float?maxSquare, bool?hasOffSku, bool?hasChangedSku, DecorationPackColor?color, DecorationPackType?packType, DecorationPackKind?packKind, DecorationPackMode?packMode, ShelfStatus?status, IList <string> spaceTypes, IList <string> styleNos, IList <string> layouts, IList <Guid> propertys, bool hasPackSeries, IList <Guid> packSeriesIds, IList <Guid> stores, bool hasStores, Guid?createrId, Dictionary <string, bool> sort, int pageIndex, int pageSize, out int rowCount, out int pageCount) { IQueryable <DecorationPack> packs = this.FindAllInner(); packs = packs.Where(x => (status == null || x.Status == status) && x.SourcePackId == null); //需求文档要求,如果楼盘条件查询不到,则过滤此条件 var hasProperties = packs.Any(s => propertyId == null || !string.IsNullOrEmpty(s.PropertysStr) && s.PropertysStr.Contains(propertyId.ToString())); #region # 标签处理 //空间类型标签 if (spaceTypes != null && spaceTypes.Any()) { PredicateBuilder <DecorationPack> builder = new PredicateBuilder <DecorationPack>(x => false); foreach (string spaceType in spaceTypes) { string sType = spaceType; builder.Or(x => x.SpaceTypesStr.Contains(sType)); } packs = packs.Where(builder.Build()); } //设计风格标签 if (styleNos != null && styleNos.Any()) { PredicateBuilder <DecorationPack> builder = new PredicateBuilder <DecorationPack>(x => false); foreach (string styleNo in styleNos) { string sStyleNo = styleNo; builder.Or(x => x.StyleNosStr.Contains(sStyleNo)); } packs = packs.Where(builder.Build()); } //居室标签 if (layouts != null && layouts.Any()) { PredicateBuilder <DecorationPack> builder = new PredicateBuilder <DecorationPack>(x => false); foreach (string layout in layouts) { string sLayout = layout; builder.Or(x => x.LayoutsStr.Contains(sLayout)); } packs = packs.Where(builder.Build()); } //楼盘标签 if (propertys != null && propertys.Any()) { PredicateBuilder <DecorationPack> builder = new PredicateBuilder <DecorationPack>(x => false); foreach (Guid property in propertys) { string sProperty = property.ToString(); builder.Or(x => x.PropertysStr.Contains(sProperty)); } packs = packs.Where(builder.Build()); } if (hasStores) { //门店标签 if (stores != null && stores.Any()) { PredicateBuilder <DecorationPack> builder = new PredicateBuilder <DecorationPack>(x => false); foreach (Guid store in stores) { string sStore = store.ToString(); builder.Or(x => x.StoresStr.Contains(sStore)); } packs = packs.Where(builder.Build()); } } else { packs = packs.Where(x => string.IsNullOrEmpty(x.StoresStr)); } if (hasPackSeries) { if (packSeriesIds != null && packSeriesIds.Any()) { packs = packs.Where(s => s.PackSeries.Select(t => t.Id).Intersect(packSeriesIds).Any()); } } else { packs = packs.Where(s => !s.PackSeries.Any()); } #endregion #region 建筑面积 || 使用面积 价格搜索 //2018-07-23 学梅确认, 价格搜索按照定价方式里面的建筑面积|使用面积勾选进行查询;建筑面积-(是否整体建筑定价|是否平米整体建筑定价为true) if (minPrice != null || maxPrice != null) { if (isBuildingPrice.Value) { if (minPrice != null && maxPrice == null) { packs = packs.Where(x => (x.BuildingTotalPrice >= minPrice && x.IsBuilding) || (x.UnitBuildingTotalPrice >= minPrice && x.IsUnitBuilding)); } else if (minPrice == null && maxPrice != null) { packs = packs.Where(x => (x.BuildingTotalPrice <= maxPrice && x.IsBuilding) || (x.UnitBuildingTotalPrice <= maxPrice && x.IsUnitBuilding)); } else if (minPrice != null && maxPrice != null) { packs = packs.Where(x => (x.BuildingTotalPrice >= minPrice && x.BuildingTotalPrice <= maxPrice && x.IsBuilding) || (x.UnitBuildingTotalPrice >= minPrice && x.UnitBuildingTotalPrice <= maxPrice && x.IsUnitBuilding)); } } else { if (minPrice != null && maxPrice == null) { packs = packs.Where(x => (x.TotalPrice >= minPrice && x.IsActual) || (x.UnitTotalPrice >= minPrice && x.IsUnitActual)); } else if (minPrice == null && maxPrice != null) { packs = packs.Where(x => (x.TotalPrice <= maxPrice && x.IsActual) || (x.UnitTotalPrice <= maxPrice && x.IsUnitActual)); } else if (minPrice != null && maxPrice != null) { packs = packs.Where(x => (x.TotalPrice >= minPrice && x.TotalPrice <= maxPrice && x.IsActual) || (x.UnitTotalPrice >= minPrice && x.UnitTotalPrice <= maxPrice && x.IsUnitActual)); } } } #endregion #region 建筑面积 || 使用面积 面积搜索 if (minSquare != null && maxSquare != null) { if (isBuildingSquare.Value) { //2018-07-05 学梅确认, 平米定价-最低购买面积判断 , 整体定价-使用面积 packs = packs.Where(x => !x.PricingType.HasValue || (x.PricingType == DecorationPackPricingType.Total && (minSquare == null || x.BuildingSquare >= minSquare) && (maxSquare == null || x.BuildingSquare <= maxSquare) || x.PricingType == DecorationPackPricingType.Unit && (minSquare == null || x.UnitBuildingSquare >= minSquare) && (maxSquare == null || x.UnitBuildingSquare <= maxSquare))); } else { //2018-07-05 学梅确认, 平米定价-最低购买面积判断 , 整体定价-使用面积 packs = packs.Where(x => !x.PricingType.HasValue || (x.PricingType == DecorationPackPricingType.Total && (minSquare == null || x.Square >= minSquare) && (maxSquare == null || x.Square <= maxSquare) || x.PricingType == DecorationPackPricingType.Unit && (minSquare == null || x.UnitSquare >= minSquare) && (maxSquare == null || x.UnitSquare <= maxSquare))); } } #endregion Expression <Func <DecorationPack, bool> > condition = x => (string.IsNullOrEmpty(keywords) || x.Keywords.Contains(keywords)) && (createrId == null || x.CreaterId == createrId) && (!hasProperties || propertyId == null || !string.IsNullOrEmpty(x.PropertysStr) && x.PropertysStr.Contains(propertyId.ToString())) && (applicableSquare == null || x.MinApplicableSquare <= applicableSquare && x.MaxApplicableSquare >= applicableSquare) && (isNewHouse == null || (isNewHouse.Value ? x.NewHouse : x.SecondHandHouse)) && (hasOffSku == null || x.HasOffShelvedSku == hasOffSku) && (hasChangedSku == null || x.HasChangedSku == hasChangedSku) && (color == null || x.Color == color) && (packType == null || x.PackType == packType) && (packKind == null || x.PackKind == packKind) && (packMode == null || x.PackMode == packMode); packs = packs.Where(condition); //排序 if (sort != null && sort.Any() && packs.Any()) { packs = packs.OrderBy(sort); } rowCount = packs.Count(); pageCount = (int)Math.Ceiling(rowCount * 1.0 / pageSize); return(packs.Skip((pageIndex - 1) * pageSize).Take(pageSize)); //return packs.ToPage(x => true, pageIndex, pageSize, out rowCount, out pageCount); }
/// <summary> /// 分页获取套餐模板列表(排除克隆版本套餐) /// </summary> /// <param name="keywords">关键字</param> /// <param name="containsNoProperty">是否包含无楼盘标签套餐(true查询)</param> /// <param name="propertys">楼盘集(查询包含此集合标签)</param> /// <param name="propertyId">楼盘Id(查询包含此楼盘标签)</param> /// <param name="houseTypeId">户型Id(查询包含此户型标签)</param> /// <param name="hasPackSeries">是否有标签(全部,标签:true,其他:false)</param> /// <param name="packSeriesIds">套餐系列集</param> /// <param name="styleNos">设计风格集</param> /// <param name="isBuildSuqare">是否是建筑面积搜索</param> /// <param name="minSquare">最小面积</param> /// <param name="maxSquare">最大面积</param> /// <param name="sort">排序条件 false为倒序</param> /// <param name="pageIndex">页码</param> /// <param name="pageSize">页容量</param> /// <param name="rowCount">总记录条数</param> /// <param name="pageCount">总页数</param> /// <returns>套餐模板列表</returns> public IEnumerable <DecorationPack> FindByCondition(string keywords, bool containsNoProperty, IList <Guid> propertys, Guid?propertyId, Guid?houseTypeId, bool hasPackSeries, IEnumerable <Guid> packSeriesIds, IEnumerable <string> styleNos, bool?isBuildSuqare, float?minSquare, float?maxSquare, Dictionary <string, bool> sort, int pageIndex, int pageSize, out int rowCount, out int pageCount) { IQueryable <DecorationPack> packs = this.FindAllInner(); packs = packs.Where(x => x.Status == ShelfStatus.Shelfed && x.SourcePackId == null); //筑家帮需求: 1、containsNoProperty false 楼盘集 只查询包含楼盘标签的套餐;2、containsNoProperty true 楼盘集 查询包含楼盘标签和无楼盘标签的套餐; //3、propertyId有值 只查询包含该楼盘标签的套餐; #region 标签处理 //系列 if (hasPackSeries) { if (packSeriesIds != null && packSeriesIds.Any()) { packs = packs.Where(s => s.PackSeries.Select(t => t.Id).Intersect(packSeriesIds).Any()); } } else { packs = packs.Where(s => !s.PackSeries.Any()); } //设计风格标签 if (styleNos != null && styleNos.Any()) { PredicateBuilder <DecorationPack> builder = new PredicateBuilder <DecorationPack>(x => false); foreach (string styleNo in styleNos) { string sStyleNo = styleNo; builder.Or(x => x.StyleNosStr.Contains(sStyleNo)); } packs = packs.Where(builder.Build()); } //楼盘标签 if (propertys != null && propertys.Any()) { PredicateBuilder <DecorationPack> builder = new PredicateBuilder <DecorationPack>(x => false); if (containsNoProperty) { foreach (Guid property in propertys) { string sProperty = property.ToString(); builder.Or(x => string.IsNullOrEmpty(x.PropertysStr) || x.PropertysStr.Contains(sProperty)); } } else { foreach (Guid property in propertys) { string sProperty = property.ToString(); builder.Or(x => x.PropertysStr.Contains(sProperty)); } } packs = packs.Where(builder.Build()); } #endregion #region 建筑面积 || 使用面积 面积搜索 if (minSquare != null && maxSquare != null) { if (isBuildSuqare.Value) { //2018-07-05 学梅确认, 平米定价-最低购买面积判断 , 整体定价-使用面积 packs = packs.Where(x => !x.PricingType.HasValue || (x.PricingType == DecorationPackPricingType.Total && (minSquare == null || x.BuildingSquare >= minSquare) && (maxSquare == null || x.BuildingSquare <= maxSquare) || x.PricingType == DecorationPackPricingType.Unit && (minSquare == null || x.UnitBuildingSquare >= minSquare) && (maxSquare == null || x.UnitBuildingSquare <= maxSquare))); } else { //2018-07-05 学梅确认, 平米定价-最低购买面积判断 , 整体定价-使用面积 packs = packs.Where(x => !x.PricingType.HasValue || (x.PricingType == DecorationPackPricingType.Total && (minSquare == null || x.Square >= minSquare) && (maxSquare == null || x.Square <= maxSquare) || x.PricingType == DecorationPackPricingType.Unit && (minSquare == null || x.UnitSquare >= minSquare) && (maxSquare == null || x.UnitSquare <= maxSquare))); } } #endregion Expression <Func <DecorationPack, bool> > condition = x => (string.IsNullOrEmpty(keywords) || x.Keywords.Contains(keywords)) && (houseTypeId == null || !string.IsNullOrEmpty(x.HouseTypesStr) && x.HouseTypesStr.Contains(houseTypeId.ToString())) && (propertyId == null || !string.IsNullOrEmpty(x.PropertysStr) && x.PropertysStr.Contains(propertyId.ToString())) //&& (!containsNoProperty || string.IsNullOrEmpty(x.PropertysStr)) ; packs = packs.Where(condition); //排序 if (sort != null && sort.Any() && packs.Any()) { packs = packs.OrderBy(sort); } rowCount = packs.Count(); pageCount = (int)Math.Ceiling(rowCount * 1.0 / pageSize); return(packs.Skip((pageIndex - 1) * pageSize).Take(pageSize)); }