首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用实体框架中的Linq使用只包含外键的表左外连接

问使用实体框架中的Linq使用只包含外键的表左外连接
EN

Stack Overflow用户
提问于 2017-10-27 00:09:47
回答 1查看 1.2K关注 0票数 0

我需要在两个表(表A和表B )上做一个左外部连接,但表B是TableA和表C之间的连接列,只有两个列都是外键。其中一列是表A的主键,另一列是表C的外键。

当实体框架没有创建一个名为TableB的对象时,如何将表外部连接?我用的是数据库优先的方法。

代码语言:javascript
复制
from a in db.tableA
join b in (no Table B object) on a.Id equals b.userId into group1
from g1 in group1.DefaultIfEmpty()
select new { id = g1.Id, userId = g1.userId }

这是一个不同的问题,但是这个问题在不能用两个外键为表创建对象方面也存在类似的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-27 07:43:01

显然,表A中的元素和表B中的元素之间存在着多对多的关系:每个A都有零或多个B,而每个B属于零或多个As。

(这里: A的复数,B的复数)

您是对的,在关系数据库中,使用第三个表实现了多到多的关系,通常称为连接表。

你是对的,如果你正确地为实体框架中的多到多关系设计好你的A类和B类,你就不能访问连接表。

,幸运的是,你不需要接线桌!

如果您已经为实体框架多对多关系正确地设置了类,它们将如下所示

代码语言:javascript
复制
class A
{
    public int Id {get; set;}

    // every A has zero or more Bs:
    public virtual ICollection<B> Bs {get; set;}

    ... //  other properties
}
class B
{
    public int Id {get; set;}

    // every B belongs to zero or more As:
    public virtual ICollection<A> As {get; set;}

    ... //  other properties
}
class MyDbContext : DbContext
{
    public DbSet<A> As {get; set;}
    public DbSet<B> Bs {get; set;}
} 

这足以告诉实体框架,您想要在As和B之间设计一个多到多的关系。

虽然您没有提到连接表,但实体框架知道需要连接表,并为您创建连接表。

您可能希望在表上使用A元素进行左边的外部连接,而在表中使用B元素,因为您希望这样做:

把表A里所有的元素都给我。所有的B都有..。

如果您要使用SQL,那么您将在表A的左边与连接表进行连接,并与表B进行某种形式的连接。之后,您将完成所需的从何处获得结果的操作。

当使用实体框架时,不需要连接表:

代码语言:javascript
复制
var result = myDbContext.As
    .Where(a => <predicate with the As you want in the result>)
    .Select(a => new
    {
        ... // properties from A that you want

        Bs = a.Bs.Where(b => <predicate with the Bs from A you want>)
    }

因为您使用了来自每个A的B,实体框架将知道必须使用连接表进行连接。因为A可能有零B,实体框架将使用左外部联接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46965609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档