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

基于EF的数据外键关联查询的更多相关文章

  1. pythonのsqlalchemy外键关联查询

    #!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...

  2. .netcore2.1 ef 使用外键关联查询

    //实体类 [Table("invoiceinfo", Schema = "obs")] public class invoice { [Key] public ...

  3. ofbiz多表外键关联查询

    实现一:Screem.xml 中的 section 里,加 <action>, 加 get-related 实现二:在代码中使用 DynamicViewEntity对象,加入addMemb ...

  4. Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

      注:本文针对的是 Entity Framework Code First 场景. 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对 ...

  5. Entity FrameWork对有外键关联的数据表的添加操作

    前天做了一个MVC Entity FrameWork项目,遇到有外键关联的数据编辑问题.当你编辑的时候,按照正常的逻辑,把每个字段的数据都对号入座了,然后点击保存按钮,本以为会顺理成章的编辑数据,但是 ...

  6. Entity Framework - 基于外键关联的单向一对一关系

    代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13  过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...

  8. Python sqlalchemy orm 多外键关联

     多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...

  9. Python sqlalchemy orm 多对多外键关联

    多对多外键关联 注:使用三张表进行对应关联 实现代码: # 创建3个表 配置外键关联 # 调用Column创建字段 加类型 from sqlalchemy import Table, Column, ...

随机推荐

  1. ADO和DAO的区别

    ADO(ACTIVEX DATA OBJECTS)应用层的数据访问接口ODBC 数据库驱动接口OLE DB 系统级数据访问接口DAO (DATA ACCESS OBJECTS) 对象的数据访问接口AD ...

  2. I.MX6 Ubuntu core porting

    /*********************************************************************** * I.MX6 Ubuntu core porting ...

  3. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  4. 【C#学习笔记】鼠标控制

    using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace ConsoleApp ...

  5. 反射小应用之DataTable和List<T>互操作

    在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List&l ...

  6. MySQL 索引详解

    本文介绍了数据库索引,及其优.缺点.针对MySQL索引的特点.应用进行了详细的描述.分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用. 索引是一种特殊 ...

  7. 火狐和google游览器的 hack独有识别 css

    先来看google的: /* 这针对于webkit内核的游览器.包括苹果谷歌游览器等*/ @media screen and (-webkit-min-device-pixel-ratio:0) { ...

  8. 1、ListView自定义控件下拉刷新(一)

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo ...

  9. 【LR】录制测试脚本中的基本菜单

    学习来源: MBoo,小强老师性能测试及Loadrunner培训  ——录制测试脚本: 1.Vuser -> run-time settings ->General Run Logic : ...

  10. <译>Selenium Python Bindings 5 - Waits

    如今,大多数的Web应用程序使用AJAX技术.当页面加载到浏览器,页面中的元素也许在不同的时间间隔内加载.这使得元素很难定位,如果在DOM中的元素没有呈现,它将抛出ElementNotVisibleE ...