/// <summary> /// 查询条件(IQueryable) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="query"></param> /// <param name="ivm"></param> /// <returns></returns> public static IQueryable <T> QueryWhere <T>(IQueryable <T> query, QueryDataInputVM ivm) { //条件 if (!string.IsNullOrWhiteSpace(ivm.wheres)) { var whereItems = JArray.Parse(ivm.wheres); foreach (var item in whereItems) { //关系符 var relation = item["relation"].ToStringOrEmpty(); string rel = DicSqlRelation[relation]; //字段 var field = item["field"].ToStringOrEmpty(); //值 var value = item["value"]; //值引号 var vqm = "\""; switch (relation) { case "Equal": case "NotEqual": case "LessThan": case "GreaterThan": case "LessThanOrEqual": case "GreaterThanOrEqual": { string val = vqm + value.ToStringOrEmpty() + vqm; string iwhere = string.Format(rel, field, val); query = DynamicQueryableExtensions.Where(query, iwhere); } break; case "Contains": case "StartsWith": case "EndsWith": { query = DynamicQueryableExtensions.Where(query, field + "." + relation + "(@0)", value.ToStringOrEmpty()); } break; case "BetweenAnd": if (value.Count() == 2) { var v1 = vqm + value[0].ToString() + vqm; var v2 = vqm + value[1].ToString() + vqm; var iwhere = string.Format(rel, field, v1, v2); query = DynamicQueryableExtensions.Where(query, iwhere); } break; } } } return(query); }
public void Where_Dynamic_Exceptions() { //Arrange var testList = User.GenerateSampleModels(100, allowNullableProfiles: true); var qry = testList.AsQueryable(); //Act Assert.Throws <ParseException>(() => qry.Where("Id")); Assert.Throws <ParseException>(() => qry.Where("Bad=3")); Assert.Throws <ParseException>(() => qry.Where("Id=123")); Assert.Throws <ArgumentNullException>(() => DynamicQueryableExtensions.Where(null, "Id=1")); Assert.Throws <ArgumentNullException>(() => qry.Where(null)); Assert.Throws <ArgumentException>(() => qry.Where("")); Assert.Throws <ArgumentException>(() => qry.Where(" ")); }
public static IQueryable <TSource> WhereInterpolated <TSource>(this IQueryable <TSource> source, FormattableString predicate) { var predicateStr = ParseFormattableString(predicate, out var args); return(DynamicQueryableExtensions.Where(source, predicateStr, args)); }
/// <summary> /// 查询条件 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="query"></param> /// <param name="param"></param> /// <returns></returns> public static IQueryable <T> QueryWhere <T>(IQueryable <T> query, QueryDataVM.GetParams param) { //条件 if (!string.IsNullOrWhiteSpace(param.wheres)) { var whereItems = JArray.Parse(param.wheres); foreach (var item in whereItems) { //关系符 var relation = item["relation"].ToStringOrEmpty(); string rel = DicSqlRelation[relation]; //字段 var field = item["field"].ToStringOrEmpty(); //值 var value = item["value"]; //值引号 var vqm = "\""; switch (relation) { case "Equal": case "NotEqual": case "LessThan": case "GreaterThan": case "LessThanOrEqual": case "GreaterThanOrEqual": { string val = vqm + value.ToStringOrEmpty() + vqm; string iwhere = string.Format(rel, field, val); query = DynamicQueryableExtensions.Where(query, iwhere); } break; case "Contains": case "StartsWith": case "EndsWith": { string iwhere = string.Format(rel, value.ToStringOrEmpty()); query = query.Where(x => EF.Functions.Like(x.GetType().GetProperty(field).GetValue(x, null).ToString(), iwhere)); } break; case "BetweenAnd": if (value.Count() == 2) { var v1 = vqm + value[0].ToString() + vqm; var v2 = vqm + value[1].ToString() + vqm; var iwhere = string.Format(rel, field, v1, v2); query = DynamicQueryableExtensions.Where(query, iwhere); } break; case "In": { var list = new List <string>(); int len = value.Count(); for (int i = 0; i < len; i++) { list.Add(value[i].ToString()); } query = query.Where(x => list.Contains(x.GetType().GetProperty(field).GetValue(x, null).ToString())); } break; case "NotIn": { var list = new List <string>(); int len = value.Count(); for (int i = 0; i < len; i++) { list.Add(value[i].ToString()); } query = query.Where(x => !list.Contains(x.GetType().GetProperty(field).GetValue(x, null).ToString())); } break; } } } return(query); }
public static IQueryable WhereInterpolated(this IQueryable source, ParsingConfig config, FormattableString predicate) { var predicateStr = ParseFormattableString(predicate, out var args); return(DynamicQueryableExtensions.Where(source, config, predicateStr, args)); }