代码改变世界

ADO.NET 与 Entity Framework 与 Linq To SQL 等 ORM 小记

2010-08-31 22:27  音乐让我说  阅读(488)  评论(0)    收藏  举报
  1. 在LINQ 中:
    System.Data.Linq.SqlClient.SqlMethods.DateDiffDay(Convert.ToDateTime("2010-08-01"), DateTime.Now);
    
    /* 返回 2010-08-01 与今天相差的天数,DateTime.Now 大于 2010-08-01 则返回正数 */
    
    
  2. 在Linq to sql 中:
    IQueryable<Purchase> query = purchases.Where(p => 
    						SqlMethods.Like(p.Description, "%" + p.Customer.Name + "%")
    						)
    				.OrderBy(p => p.ID).Select(p => p);
    

     

  3. EF Code First 如何输出 EF 的日志?
    Context.Database.Log = new Action<string>(q => Debug.WriteLine(q));

     

  4. Dapper 下载
  5. EfRepository 设计下载
  6. 关于连接查询分组统计我们可以使用SelectMany,如下:

    监控sql如下:(是不是简洁多了呢?)

    关于SelectMany资料:

    http://www.cnblogs.com/lifepoem/archive/2011/11/18/2253579.html

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

  7. 附加一个实体到 EF 的上下文
            /// <summary>
            /// 附加一个实体到 EF 的上下文,或者返回一个已经被附加的实体,前提是它已经被附加过了。
            /// </summary>
            /// <typeparam name="TEntity">要附加的实体的类型</typeparam>
            /// <param name="entity">要附加的实体的实例</param>
            /// <returns>已经被附加的实体</returns>
            protected virtual TEntity AttachEntityToContext<TEntity>(TEntity entity) where TEntity : new()
            {
                //在实体框架真正支持存储过程之前,这个是有必要的
                //否则,在实体附加到上下文之前,不会加载已加载实体的导航属性。
                var alreadyAttached = context.Set<TEntity>().Local.FirstOrDefault(x => x.Id == entity.Id);
                if (alreadyAttached == null)
                {
                    context.Set<TEntity>().Attach(entity);
                    return entity;
                }
                return alreadyAttached;
            }

     

  8. 使用 EF 时,记得一定要在不准备修改实体的时候,在从 EF 拿数据的时候就要调用 AsNoTracking() 方法,意思是让 EF 不要自动跟踪实体的变化,从而加快获取速度。常见的有 获取分页列表等等。
    context.Set<TEntity>().AsNoTracking()

     

  9. 谢谢浏览!