Объединение двух репозиториев в Entity Framework Core - PullRequest
1 голос
/ 08 января 2020

Таблица 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

Существует универсальный репозиторий c, который обрабатывает только один класс сущностей для каждой таблицы A и таблицы B.

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

Потребитель будет вызывать API следующим образом: {apiroute}/?id=1&code=FN

Я должен фильтровать по идентификатору, который является значением столбца b_id в TableB, и кодом, который является значением столбца aid_code в таблице A, но только в TableB имеет значение столбца a_id из таблицы A.

Я добавил дополнительное не сопоставленное свойство, которое говорит Code в сущности таблицы B для хранения значения для aid_code из таблицы A, и сделал соединение между API-интерфейсом Entity и Entity B. I ' m создание динамического c объекта с использованием 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, но не применимо фильтрование по предложению where. И он выполняет объединение таблиц A и B, игнорируя предложение where, которое выполняется вечно.

Что я делаю не так?

1 Ответ

1 голос
/ 09 января 2020

Все, я решил эту проблему, используя include вместо того, чтобы выполнять соединение и возвращать динамический c объект. Во-первых, я добавил отношение один ко многим между сущностями в DBContext (как я использую EntityFrameworkCore), как указано ниже:

// Это модельBuilder для EntityA

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...