有没有什么方法,使用EF框架,可以动态获取想要的字段,多条件查询,而且生成的SQL是最简?

时间:2022-08-31 09:05:48
在网上找了以下代码然后照着改了一下,动态获取想要的字段,多条件查询都实现了,但是查询生成的SQL,还是会查询所有字段。不知csdner或者外国的coder有没有解决方法?又或者其他的受众比较广,一直有在支持的ORM架构能实现该想法?


        private void MainForm_Load(object sender, EventArgs e)
        {
            Expression<Func<t_User, bool>> expr = PredicateExtensions.True<t_User>().And(t => t.UserId == "ABC").And(t => t.Password == "123");
            var query = GetUser((u) => { return new { u.UserId, u.UserName }; }, expr.Compile());
        }

        public IEnumerable<TProjection> GetUser<TProjection>(Func<t_User, TProjection> projection, Func<t_User, bool> predicate)
        {
            var a = from user in se.t_User.Where(predicate) select projection(user);
            return a;
        }

//老外的一个多条件查询类
    public static class PredicateExtensions
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }
        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
        }
        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>(Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
        }
    } 

7 个解决方案

#1


先做一个select再查询
或者直接调用sql

#2


只要你把编译原理看完,把sql所有的token重新实现一边就ok了

额,你确定你真要如此?

兄弟,ORM的职责不是为了让你去做CRUD,ORM最关键的职责是关系转对象,是解决关系和对象的不适配。理解这点你就知道为啥他们都不直接查字段了,因为动态的字段无法对应一个固定对象,除非你打算动态编译一个对象出来。

#3


有人说ruby才是做web和orm的人喜欢的东西,我想你会喜欢他滴,动态构建一个实体对ruby这类语言无负担,所以我可以大胆猜一下,ruby下的ORM是你喜欢的东西

#4


主要是因为假如查询我写成

            var b = from u in se.t_User
                    where u.UserId == "ABC" && u.Password == "123"
                    select new { UserId = u.UserId, UserName = u.UserName };

那么生成的查询语句就是类似select UserId,UserName from...的最简语句,以前写查询都是getbyXXX,我就在想又没有一个方法能适应所有查询,于是就搜索了下。
但我也刚接触LINQ,如果思路不对,请指教。

#5


其实我也有在寻找其他ORM框架,貌似是ELINQ吧,号称想查啥就查啥,不会有多余的动作,不会查多余的东西。但是我还是希望使用官方的东西,毕竟支持更好些。之前介绍的文章找不到了,汗啊

#6


多条件查询用Linq.Dynamic 试试看?

#7


试试.规约模式.

#1


先做一个select再查询
或者直接调用sql

#2


只要你把编译原理看完,把sql所有的token重新实现一边就ok了

额,你确定你真要如此?

兄弟,ORM的职责不是为了让你去做CRUD,ORM最关键的职责是关系转对象,是解决关系和对象的不适配。理解这点你就知道为啥他们都不直接查字段了,因为动态的字段无法对应一个固定对象,除非你打算动态编译一个对象出来。

#3


有人说ruby才是做web和orm的人喜欢的东西,我想你会喜欢他滴,动态构建一个实体对ruby这类语言无负担,所以我可以大胆猜一下,ruby下的ORM是你喜欢的东西

#4


主要是因为假如查询我写成

            var b = from u in se.t_User
                    where u.UserId == "ABC" && u.Password == "123"
                    select new { UserId = u.UserId, UserName = u.UserName };

那么生成的查询语句就是类似select UserId,UserName from...的最简语句,以前写查询都是getbyXXX,我就在想又没有一个方法能适应所有查询,于是就搜索了下。
但我也刚接触LINQ,如果思路不对,请指教。

#5


其实我也有在寻找其他ORM框架,貌似是ELINQ吧,号称想查啥就查啥,不会有多余的动作,不会查多余的东西。但是我还是希望使用官方的东西,毕竟支持更好些。之前介绍的文章找不到了,汗啊

#6


多条件查询用Linq.Dynamic 试试看?

#7


试试.规约模式.