Ejemplo n.º 1
0
        /// <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));
        }
Ejemplo n.º 4
0
        /// <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));
        }