基于EF的数据外键关联查询

现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦。而我现在要做的就是基于EF的外键关联查询。很方便的。

 

首先,创建基础查询的BaseService

public class BaseService<T> where T : BaseEntity
    {
        public virtual int Create(T item)
        {
            using (var db = new DatabaseContext())
            {
                db.Set<T>().Add(item);

                try
                {
                    var result = db.SaveChanges();

                    return result;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public virtual T GetItem(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, params Expression<Func<T, object>>[] includeProperties)
        {
            using (var db = new DatabaseContext())
            {
                var query = db.Set<T>().AsExpandable().AsNoTracking();

                if (filter != null) query = query.Where(filter);

                if (includeProperties != null && includeProperties.Length > 0) query = includeProperties.Aggregate(query, (current, includeProperty) => current.Include(includeProperty));

                if (orderBy != null) query = orderBy(query);

                return query.FirstOrDefault();
            }
        }
    }

BaseEntity见 基于EF创建数据库迁移

这里只添加了2个方法,一个新增,一个查询单条数据。

GetItem方法的includeProperties参数就是用于引用关联数据。

接下来添加RoleService和UserService类。

  public class RoleService : Base.BaseService<Roles>
    {
        public static RoleService Default = new RoleService();
    }

  public class UserService : Base.BaseService<Users>
    {
        public static UserService Default = new UserService();
    }

这2个类都集成BaseService,在没有特殊查询的时候,直接使用BaseService的查询方法。

 

接下来添加数据

var roleId = Guid.NewGuid();
var result = Service.Service.RoleService.Default.Create(new Roles { Id = roleId, Name = "admin" });

var result = Service.Service.UserService.Default.Create(new Users { Id = Guid.NewGuid(), Name = "admin", RoleId = roleId });

数据有了,接下来就是查询了 。

var user = Service.Service.UserService.Default.GetItem(x => x.Name == "admin", null, x => x.Role);

这些你打开user,发现里面的Role实体也拥有数据。

 

posted @ 2016-11-30 13:24  小胖脸  阅读(3666)  评论(0编辑  收藏  举报