我需要在两个表(表A和表B )上做一个左外部连接,但表B是TableA和表C之间的连接列,只有两个列都是外键。其中一列是表A的主键,另一列是表C的外键。
当实体框架没有创建一个名为TableB的对象时,如何将表外部连接?我用的是数据库优先的方法。
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 }这是一个不同的问题,但是这个问题在不能用两个外键为表创建对象方面也存在类似的问题。
发布于 2017-10-27 07:43:01
显然,表A中的元素和表B中的元素之间存在着多对多的关系:每个A都有零或多个B,而每个B属于零或多个As。
(这里: A的复数,B的复数)
您是对的,在关系数据库中,使用第三个表实现了多到多的关系,通常称为连接表。
你是对的,如果你正确地为实体框架中的多到多关系设计好你的A类和B类,你就不能访问连接表。
,幸运的是,你不需要接线桌!
如果您已经为实体框架多对多关系正确地设置了类,它们将如下所示
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进行某种形式的连接。之后,您将完成所需的从何处获得结果的操作。
当使用实体框架时,不需要连接表:
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,实体框架将使用左外部联接。
https://stackoverflow.com/questions/46965609
复制相似问题