在Entity Framework Core中的两个存储库之间连接

问题描述 投票:1回答:1

表A

a_id (PK) 
aid_code 
aid_desc

a_id |  aid_code |  aid_desc
----    --------    --------
1301 |  FN       |  FAN
1302 |  PN       |  PAN
1303 |  LN       |  LAN

->表A具有一列主键。

表B

b_id (PK)
b_enddate (PK)
a_id (PK)
b_dob
b_name
code (not mapped property)

->表B具有使用3列的复合主键。

b_id |  b_endate    |   a_id |  b_dob       |   b_name
----    ---------       ----    ----------      ------
1    |  01/01/2020  |   1301 |  01/01/2017  |   sam
1    |  10/02/2020  |   1302 |  02/01/2016  |   ham
2    |  01/10/2022  |   1303 |  03/01/2016  |   jam
3    |  11/10/2023  |   1302 |  05/01/2015  |   bam

有一个通用存储库,每个表A和表B仅处理一个实体类。

var a = context.GetRepository<A>();
var b = context.GetRepository<B>();

使用者将以这种方式调用API:{apiroute}/?id=1&code=FN

我必须按ID过滤,这是TableB中的b_id列值,而代码是表A中的aid_code列值,但TableB仅具有表A中的a_id列值。

[我在表B实体中添加了其他未映射的属性,表示Code保留表A中的aid_code的值,并在实体API之间进行了连接和实体B。我正在使用select new EntityB{ code = entityA.aid_code, ..... }

创建动态对象
var records = from a in entityA
              join b in entityB on b.a_id equals a.a_id
             select new  EntityB{ b_id = b.b_id, b_enddate = b.b_enddate, code = entityA.aid_code, ..... }

[返回类型必须为IQueryable<EntityB>,因为稍后我将执行ToList()

我必须通过准备一个串联的where子句来进行最后的过滤,但是by where子句的过滤不起作用。并且它在表A和B之间进行联接,而忽略了永远运行的where子句。

我在做什么错?

linq entity-framework-core repository-pattern
1个回答
1
投票

全部,我使用include解决了此问题,而不是执行联接并返回动态对象。首先,如下所示,我在DBContext中的实体之间添加了一对多关系(因为我正在使用EntityFrameworkCore):

//这是EntityA的modelBuilder

entity.HasMany(m => m.EntityB)
                .WithOne(c => c.EnitityA)
                .HasForeignKey(k => k.a_id );

如下所示在EntityB中添加相应的导航属性:

public virtual EntityA EntityA { get; set; }

同样,如下所示,在EntityA中添加用于导航的相应属性:

public virtual ICollection<EntityB> EntityB { get; set; }

然后最后包括:

var query = repoB.GetAll().Include("EntityA").AsNoTracking() as IQueryable<EntityB>

然后对上述查询执行where子句:

var returnVal = query.Where(x => x.EntityB.aid_code == paramValue):
var result = returnVal.ToList();
© www.soinside.com 2019 - 2024. All rights reserved.