现在很多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实体也拥有数据。