Как получить данные из двух таблиц и сохранить их в DTO в Net Core Entity Framework? - PullRequest
0 голосов
/ 10 января 2019

Я просто объясняю это на примере, скажем, у меня есть две таблицы, поле и поле модуля

field
id     name          ismodule
1      Firstname     1
2      Lastname      0

modulefield
id     moduleid      fieldid
1      22            1

Это простое представление моей базы данных. Теперь в EF, как я могу получить строку с этими столбцами

modulefield.moduleid     field.id     field.name
22                       1            Firstname

По сути, я просто хочу получить modulefield.moduleid, если field.ismodule имеет значение true.

Эквивалентный скрипт sql, я думаю, для этого

SELECT b.submoduleid, a.* FROM field a, modulefield b;

Мой текущий код (фрагмент)

   var result = new List<FieldDTO>();
   var fields = await _repo.GetAsync<Field>();
   result = _mapper.Map<List<FieldDTO>>(fields);

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете использовать linq join , чтобы вернуть List<FieldDTO> напрямую.

var result = (from e in _context.Fields
                     join mf in _context.ModuleFields on e.Id equals mf.FieldId
                     where e.IsModule == 1

                     select new FieldDTO
                     {
                         ModulefieldModuleid = mf.ModuleId,
                         FieldId = e.Id,
                         FieldName=e.Name


                     }).ToList();
0 голосов
/ 10 января 2019

Я предполагаю, что может быть более одного модуля на поле. Запрос:

SELECT mf.submoduleid, f.id, f.name 
FROM field AS f, modulefield AS mf
WHERE f.ismodule = 1 AND
    f.id = mf.fieldid

EF Linq выражение:

List<FieldDTO> result = _context.Fields
    .Include("ModuleField")
    .Where(f => f.ismodule == true)
    .Select(f => new FieldDTO(){
        ModuleFieldModuleId = f.ModuleField.moduleid,
        FieldId = f.id,
        FieldName = f.Name})
    .ToList();

ModuleField - свойство навигации в классе поля.

EDIT:
Модели:

public class Field
{
    [Key]
    public long Id { get; set; }

    public string FieldName { get; set; }

    [NotMapped]
    public bool IsModule 
    {
        get
        {
            return this.Module != null;
        }
    }

    public virtual Module Module {get; set;}
}

public class Module
{
    [Key]
    public long Id { get; set; }

    public string ModuleName { get; set; }

    public virtual IEnumerable<Field> Fields { get; set }
}

При создании модели:

modelBuilder.Entity<Field>()
                .HasOptional(s => s.Module); // Marking property optional

Получение Module.ModuleId, если IsModule of Field имеет значение true:

List<FieldDTO> result = _context.Fields
    .Include("Module")
    .Where(f => f.IsModule == true)
    .Select(f => new FieldDTO(){
        ModuleFieldModuleId = f.Module.Id,
        FieldId = f.Id,
        FieldName = f.Name})
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...