表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子句。
我在做什么错?
全部,我使用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();