ADO.NET Entity Framework 5.0 小结

本文分享了使用EntityFramework进行动态条件查询、动态排序及分页等实用技巧,并介绍了如何安全地管理数据库连接字符串和自动获取新增记录ID的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近使用Entity Framework 开发,分享一下这次使用的心得。这次的开发时间比较少,代码有些粗糙,请大家包涵。


1、多一点使用 IQueryable,少一点使用 IEnumerable。因为使用IQueryable 可以看到实际执行的sql语句,而且在动态排序、动态条件查询上容易得多。

2、动态条件查询

/// <summary>
        /// 查询条件
        /// </summary>
        /// <param name="source">对象</param>
        /// <param name="yhm">用户名</param>
        /// <param name="xm">姓名</param>
        /// <returns></returns>
        public IQueryable<YHJBXX> getCondition(IQueryable<YHJBXX> source, string yhm, string xm)
        {
            var condi = source;
            if (!string.IsNullOrWhiteSpace(yhm))
            {
                condi = condi.Where(t => t.YHM != null && t.YHM.Contains(yhm));
            }
            if (!string.IsNullOrWhiteSpace(xm))
            {
                condi = condi.Where(t => t.XM != null && t.XM.Contains(xm));
            }
            return condi;
        }


使用contains的童鞋要注意了,为什么这里需要加不等于null,因为当记录有null的时候,contains就会报引用未设置项的错误,我也理解不了为什么会这样。


3、动态排序。这里要先加一个设置排序的公用类LinqTools,getOrder<T>方法是外部调用用于排序的。QueryableExtensions类是在网上抄的,用途就是动态排序

 class LinqTools
    {
        private static object GetPropertyValue(object obj, string property)
        {
            System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
            return propertyInfo.GetValue(obj, null);
        }
        private static string[] getkv(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                return new string[2]{"",""};
            }
            else
            {
                int idx = str.IndexOf(" ");
                if (idx < 0)
                {
                    return new string[2]{str, ""};
                }
                else
                {
                    return new string[2]{str.Substring(0, idx), str.Substring(idx + 1)};
                }
            }
        }
        

        public static IQueryable<T> getOrder<T>(IQueryable<T> query, string orderby)
        {
            if (!string.IsNullOrEmpty(orderby))
            {
                List<string[]> lst = new List<string[]>();
                //排序的列
                foreach (var item in orderby.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries))
                {
                    lst.Add(getkv(item));
                }
                if (lst.Count > 0)
                {                    
                    IOrderedQueryable<T> order = null;
                    if (lst[0][1].ToLower() == "desc")
                    {                        
                        order = QueryableExtensions.OrderBy<T>(query, lst[0][0],true);
                       
                    }
                    else
                    {                        
                        order = QueryableExtensions.OrderBy<T>(query, lst[0][0]);
                    }
                    //多列排序
                    for (int i = 1; i < lst.Count; i++)
                    {
                        if (lst[i][1].ToLower() == "desc")
                        {                            
                            order = QueryableExtensions.ThenBy(order, lst[i][0],true);
                        }
                        else
                        {
                            order = QueryableExtensions.ThenBy(order, lst[i][0]);
                        }
                    }                    
                    query = order.AsQueryable();
                }
            }
            return query;
        }
    }

public static class QueryableExtensions
    {
        public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> queryable, string propertyName)
        {
            return OrderBy(queryable, propertyName, false);
        }
        public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> queryable, string propertyName, bool desc)
        {
            var param = Expression.Parameter(typeof(T));
            var body = Expression.Property(param, propertyName);
            dynamic keySelector = Expression.Lambda(body, param);
            return desc ? Queryable.OrderByDescending(queryable, keySelector) : Queryable.OrderBy(queryable, keySelector);
        }

        public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> queryable, string propertyName)
        {
            return ThenBy(queryable, propertyName, false);
        }
        public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> queryable, string propertyName, bool desc)
        {
            var param = Expression.Parameter(typeof(T));
            var body = Expression.Property(param, propertyName);
            dynamic keySelector = Expression.Lambda(body, param);
            return desc ? Queryable.ThenByDescending(queryable, keySelector) : Queryable.ThenBy(queryable, keySelector);
        }
    }

4、动态查询、动态排序、动态分页

public List<YHJBXX> getDataWithPage(string yhm,string xm,string orderby,int pageindex,int pagesize)
        {
            using (ZJHMDEntities ctx = new ZJHMDEntities())
            {
                var condi = getCondition(ctx.YHJBXX, yhm, xm);
                var order = LinqTools.getOrder<YHJBXX>(condi, orderby);
                var skip = order.Skip(pagesize * (pageindex - 1)).Take(pagesize);                
                return skip.ToList();
            }
        }

需要说一下的是,这里排序是必须的,否则到了skip这个方法的时候会提示错误的,其实不排序也可以分页的,自己改改代码,这里就不说了。


5、加密数据库连接字符串。ZJHMDModel.edmx 我的一个ado.net实体 ,里面有一个ZJHMDModel.Context.tt 的文件,ZJHMDModel.Context.cs里,

 public ZJHMDEntities()
            : base("name=ZJHMDEntities")
        {
            this.Database.Connection.ConnectionString = ZJHMDSettings.connectstr;
        }

 ZJHMDSettings.connectstr 是我解密后的字符串,建议这个字符串设置成只读,否则每一次访问数据库都调用一次解密方法,性能是有损耗的而且没有必要。

注意的,每次edmx文件每次重新生成的时候,这个方法都会被重置,暂时没有更好的办法。


6、自动递增ID的获取方法。很多时候我们用了oracle的触发器,在新建记录时,自动填入序号到ID里,ado.net 实例该如何获取加入记录后的ID号呢。答案如下,在edmx文件里,设置列的StoreGeneratePattern属性为 Identity,保存记录后,ID列自然就可以获取到相应的值了。



7、强制执行更新操作。一般情况下,我们会先找到这条记录,然后更改,最后就保存。

public void loginSucc(string yhm)
        {
            using (ZJHMDEntities ctx = new ZJHMDEntities())
            {
                YHJBXX obj = ctx.YHJBXX.FirstOrDefault(t => t.YHM == yhm);
                obj.ZJDLSJ = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                obj.SCMMCS = 0;
                ctx.SaveChanges();
            }
        }

然而,我们想直接更新某个对象,可以先用Attach方法附加到entities上,然后更改需要保存的字段的状态。如果想整条记录所有列都更新,可以直接赋值

et.State= System.Data.EntityState.Modified;

public int updateYH(YHJBXX yh)
        {
            int rtv = 0;
            using (ZJHMDEntities ctx = new ZJHMDEntities())
            {
                YHJBXX obj = ctx.YHJBXX.Attach(yh);
                var et = ctx.Entry(obj);
                //et.State= System.Data.EntityState.Modified;
                et.Property("GXSJ").IsModified = true;
                et.Property("GXYH").IsModified = true;
                et.Property("MM").IsModified = true;
                et.Property("XM").IsModified = true;
                et.Property("SJHM").IsModified = true;
                et.Property("JS").IsModified = true;
                et.Property("SCMMCS").IsModified = true;
                et.Property("LOCK_FLAG").IsModified = true;
                rtv = ctx.SaveChanges();                
            }
            return rtv;
        }


这里说的,只是一些很普通的方法,而且只是针对单表操作的,够用就好。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值