添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
直爽的马克杯  ·  PdfBox品尝(II) ...·  1 年前    · 
高兴的硬币  ·  ClickHouse ...·  1 年前    · 

EF Core使用Include和join

在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同。

例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外键GenreId连接流派表Genre(GenreId,Name)。每个唱片归属唯一一个流派,一个流派可以对应多个唱片。

1.Join():

两表不必含有外键关系,需要代码手动指定连接外键相等(具有可拓展性,除了值相等,还能指定是>,<以及其他对两表的相应键的关系),以及结果字段。

  • 那么可以这么写两个表的连接:
var wholeRecord = dc.Album.Join(dc.Genre, a => a.GenreId, g => g.GenreId, (a, g) => new { a.AlbumId,a.Name,g.GenreId,g.Name;

这样就选取除了两表的AlbumId,Name,GenreId,Name。

2.Include():

两表必须含有外键关系,只需要指定键名对应的类属性名即可,不需指定结果字段(即全部映射)。默认搜索某表时,不会顺带查询外键表,直到真正使用时才会再读取数据库查询;若是使用 Include(),则会在读取本表时把指定的外键表信息也读出来。

  • 那么可以这么写两个表的连接:
//EF已经生成了Album和Genre的数据库映射模型类以及导航属性
var wholeRecord=dc.Album.Include("Genre");
//var wholeRecord=dc.Album.Include(a=>Genre);

这样数据库就执行了一个左连接,把Album和Genre的所有字段全部连起来了,并且Include()是立即查询的,像ToList()一样,不会稍后延迟优化后再加载。

这样其实效率很低,因为如果两张表记录很大,那么连接是个费时费资源的事情,建议少用,或者先筛选出需要的结果集再连接。

Include和ThenInclude区别

“Include”在我们不需要多级数据的对象上运行良好,但如果需要获得多级数据,那么“ThenInclude”是最合适的。让我用一个例子解释一下。假设我们有3个实体,公司,客户经理和顾客:

public class Company
    public string Name { get; set; }
    public class Manager{ get; set; }
public class Manager
	public string Name { get; set; }
	public class Client { get; set; }
 public class Client
    public string Name { get; set; }
    public string ClientMessage { get; set; }

现在,如果你想公司和公司下的客户经理你可以像下面那样使用“Include”,这样你拿到的是company的name和Manager的name

using (var context = new YourContext())
  var customers = context.Company
    .Include(c => c.Clients)
    .ToList();

但是如果您想要公司和客户经理以及顾客,因为顾客没有直接和公司关联,所以不能使用include直接关联到,这时候您可以使用“ThenInclude”,这样你拿到的就是company的name和Manager的name还有Client的ClientMessage

using (var context = new MyContext())
   var customers = context.Company
    .Include(i => i.Manager )
      .ThenInclude(a => a.ClientMessage )
    .ToList();

这相当于用关联出来的manager去关联client

EF Core使用Include和join在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同。例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外键GenreId连接流派表Genre(GenreId,Name)。每个唱片归属唯一一个流派,一个流派可以对应多个唱片。1.Join():两表不必含有外键...
Entity Framework Core 允许你在模型中使用导航属性来加载相关实体。有三种常见的 O/RM 模式可用于加载关联数据。 预先加载表示从数据库中加载关联数据,作为初始查询的一部分。 显式加载表示稍后从数据库中显式加载关联数据。 延迟加载表示在访问导航属性时,从数据库中以透明方式加载关联数据 这里仅结束第一种,使用Include的方式。 什么是关联的数据? 如下图,两个导航属性Assets以及Department,分别对应两个外键AssetsId以及DepartmentId,关联到另.
我们来看看下面的代码,这个代码是一个INNER JOINEF Core查询,其中用SubCategory表INNER JOIN了SubCategoryLanguage表,但是我们需要在SubCategoryLanguage表上只查询出其DataStatus等于1的行,所以需要用到子查询: var count = dbContext.SubCategory.Where(e =&gt...
问题来了,我要和故事开头一样,老公-狗,老婆-猫,对应起来,怎么查询呢? 有同学说这还不简单?两个遍历一下不就行了。 首先 取出 List<宠物>集合,再根据宠物的主人Id去查找对应的主人信息就好了。 如果这样设计,那么将会执行3次查询: l 查出所有的宠物。 l 查出阿猫的主人。 l 查出阿狗的主人。 数据量不大还好,数据量要是大一点这是非常影响速
在entity framework core中,如果两个实体涉及到外键连接,查询的时候默认是只查自身而不会去查询外键表的。如果想要让查询结果包含外键实体,则需要使用include方法来让查询结果包含外键实体。如 _dbContext.ProductStandard.Include(o=>o.Product).SingleOrDefault(o => o.Id == id);
EF Core使用IncludejoinEF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同。 例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外键GenreId连接流派表Genre(GenreId,Name)。每个唱片归属唯一一个流派,一个流派可以对应多个唱片。 1.Join(): 两表不必含有外键关系,需要代码手动指定连接外键相等(具有可拓展性,除了值相等,还能指定是>,<以及其他对两表的相应键
   A   left   join    B    的连接的记录数与A表的记录数同     A   right   join    B    的连接的记录数与B表的记录数同       A   left   join    B    等价B   right   join    A table    A:     Field_K,    Field_A    1                        a    3                        b    4                        c    table  
Python 中输出文字编码的函数是 `print()`。如果你想要输出特定编码的文字,可以在 `print()` 函数中使用 `encode()` 方法。例如,如果你想要输出 UTF-8 编码的文字,可以这样写: print("你好,世界!".encode("utf-8")) 这将输出 b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'。