能否在 ISugarQueryable 新增加 WhereOr 返回

SqlSugar
11 93
var exp= Expressionable.Create<Student>();
exp.OrIF(条件,it=>it.Id==1);//.OrIf 是条件成立才会拼接OR
exp.Or(it =>it.Name.Contains("jack"));//拼接OR
var list=db.Queryable<Student>().Where(exp.ToExpression()).ToList();

这种写法感觉破坏风格。

热忱回答11

  • 这种扩展性强,加条件好加,如果你原生的OR你想在加AND就不好加了

    0 回复
  • .Queryable.Or(x=>it.id==1) 你想在加and你就不好加了

    0 回复
  • @fate sta:我觉得可以内置一个这个方法

    /// <summary>
            /// List的Or查询
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <typeparam name="F"></typeparam>
            /// <param name="sugarQueryable"></param>
            /// <param name="isWhere"></param>
            /// <param name="fieldName">哪个查询字段</param>
            /// <param name="inList">被用来查询的List</param>
            /// <param name="conditionalType"></param>
            /// <returns></returns>
            public static ISugarQueryable<T> WhereIfListOr<T, F>(this ISugarQueryable<T> sugarQueryable, bool isWhere,
                Expression<Func<T, object>> fieldName, List<F> inList, ConditionalType conditionalType)
            {
                if (isWhere)
                {
                    WhereListOr(sugarQueryable, fieldName, inList, conditionalType);
                }
    
                return sugarQueryable;
            }
    
            /// <summary>
            ///  List的Or查询
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <typeparam name="F"></typeparam>
            /// <param name="sugarQueryable"></param>
            /// <param name="fieldName">哪个查询字段</param>
            /// <param name="inList">被用来查询的List</param>
            /// <param name="conditionalType"></param>
            /// <returns></returns>
            public static ISugarQueryable<T> WhereListOr<T, F>(this ISugarQueryable<T> sugarQueryable, Expression<Func<T, object>> fieldName,
                List<F> inList, ConditionalType conditionalType)
            {
                List<IConditionalModel> list = new List<IConditionalModel>();
                List<KeyValuePair<WhereType, ConditionalModel>> list2 =
                    new List<KeyValuePair<WhereType, ConditionalModel>>();
                foreach (F @in in inList)
                {
                    string fieldValue = (@in is Enum) ? Convert.ToInt32(@in).ToString() : @in.ObjToString();
                    list2.Add(new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or, new ConditionalModel
                    {
                        FieldName = GetPropertyName(fieldName),
                        ConditionalType = conditionalType,
                        FieldValue = fieldValue
                    }));
                }
    
                list.Add(new ConditionalCollections
                {
                    ConditionalList = list2
                });
    
                sugarQueryable = sugarQueryable.Where(list);
    
                return sugarQueryable;
            }
    
            private static string GetPropertyName<T>(Expression<Func<T, object>> expr)
            {
                string result = "";
                if (expr.Body is UnaryExpression)
                {
                    result = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name;
                }
                else if (expr.Body is MemberExpression)
                {
                    result = ((MemberExpression)expr.Body).Member.Name;
                }
                else if (expr.Body is ParameterExpression)
                {
                    result = ((ParameterExpression)expr.Body).Type.Name;
                }
    
                return result;
            }

    我自己虽然封装好了 , 但是时不时会忘记有这个方法 , 特别是新项目 。 

    0 回复
  • 你这个是多主键的  的   in操作吗?

    0 回复
  • @fate sta:目前只支持一个字段进行操作 , 无法支持多字段操作 , 毕竟反射太慢了 . 如果不是十分的必要 , 建议零散操作更加灵活 .  至于什么操作目前具体由  ConditionalType  参数决定 . 如果想要多主键批量的 In 操作 , 估计要再捣鼓一下 . 其实这里的 FieldName = GetPropertyName(fieldName),   这一句放到foreache 里面也是不合理的 . 

    0 回复
  • @Aaron 傲:.WhereColumns(new List<Dictionary<string, object>>)  最新版本支持了字典实现多字段查询

    0 回复
  • image.png

    0 回复
  • 上面几种写法都支持我字段查询

    0 回复
  • image.png

    0 回复
  • @fate sta:其实我这里就是封装了一个批量的模糊查询 , 你提供的方法除了 。 

    var exp= Expressionable.Create<Student>();
    exp.OrIF(条件,it=>it.Id==1);//.OrIf 是条件成立才会拼接OR
    exp.Or(it =>it.Name.Contains("jack"));//拼接OR
    var list=db.Queryable<Student>().Where(exp.ToExpression()).ToList();

    这个能够批量的模糊查询以外 , 其他的方法就要foreach 。无法通过ExternalList.Contains(p=>p.xxxId) 实现,除非有一种这样的写法

    ExternalList.Contains(p=>p.xxxId , conditionalType.LeftLike

    0 回复
  • 好的我研究一下

    0 回复