ElenaRez Ответов: 1

Как объединить три таблицы, чтобы получить значения, которые не находятся в состоянии запроса


I'm implementing asp.net core project. I have 3 tables Apiapp, ApiAppHistory and EntityType. There are three fields with the names SentType, Status and Reason in ApiAppHistory and those fields are of kind Id (int type) in APIApphistory. I joined ApiApp and ApiAppHistory tables in order to get those three fields from ApiAppHistory but because they are of kind int and are unclear when showing the result to the user, I join them with EntityType table which has their related name in the name column. I mean, in the select part of my query, in addition to ApiApp fields I also need to have SentType, Status and Reason name fields and their names are in entityType table. For instance, the fields SentType, Status and Reason in APIApphistory will have values 4,5,1. so for obtaining their related names I have to join APIAppHistoy with EntityType table to get their related name that are:d,e,a. But I don't know how to do it. Here below is my incomplete query:

var qq = _context.Apiapp
           .Include(a => a.Api)
           .Include(a => a.Application)
           .Include(a => a.Data);

  var t12 = (from r in qq
                   from b in _context.ApiAppHistory
                   from s in _context.EntityType
                   where r.LastRequest== b.Id && b.SentType == s.Id 
   && b.Reason == s.Id
                   && b.Status == s.Id
                    select new { r, b.Reason (instead I want its related s.name), b.SentType (instead I want its related s.name), b.Status (instead I want its related s.name)});


Я хочу в select part моего запроса получить имя тех 3 полей, которые я указал в таблице EntityType. Однако я не знаю, как объединить ApiAppHistory и EntityType таким образом, чтобы получить связанные имена для SentType, Reason ans Status из EntityType. Потому что, вступив Благодаря и ApiAppHistory я могу получить идентификатор эти поля. Я буду признателен, если кто-нибудь мне поможет.

Вот мой стол атрибутом entitytype :

Id Name EntityKey
1   a    Reason
2   b    Reason
3   c    SentType
4   d    SentType
5   e    Status
6   f    Status


мы не используем ключ из EntityType в запросе. Ключевые значения в EntityType предназначены только для разъяснения разработчику значения других столбцов

Что я уже пробовал:

var qq = _context.Apiapp
           .Include(a => a.Api)
           .Include(a => a.Application)
           .Include(a => a.Data);

  var t12 = (from r in qq
                   from b in _context.ApiAppHistory
                   from s in _context.EntityType
                   where r.LastRequest== b.Id && b.SentType == s.Id 
   && b.Reason == s.Id
                   && b.Status == s.Id
                    select new { r, b.Reason (instead I want its related s.name), b.SentType (instead I want its related s.name), b.Status (instead I want its related s.name)});

public partial class ApiAppHistory
    {
        public int Id { get; set; }
        public int? SentType { get; set; }
        public int? Reason { get; set; }
        public int? Status { get; set; }


        public virtual Apiapp ApiApp { get; set; }
        public virtual EntityType StatusNavigation { get; set; }
        public virtual EntityType SentTypeNavigation { get; set; }
        public virtual EntityType ReasonNavigation { get; set; }
    }

 public partial class EntityType
    {
        public EntityType()
        {
            ApiAppHistoryStatusNavigation = new HashSet<ApiAppHistory>();
            ApiAppHistorySentTypeNavigation = new HashSet<ApiAppHistory>();
            ApiAppHistoryReasonNavigation = new HashSet<ApiAppHistory>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public string EntityKey { get; set; }

        public virtual ICollection<ApiAppHistory> ApiAppHistoryStatusNavigation { get; set; }
        public virtual ICollection<ApiAppHistory> ApiAppHistorySentTypeNavigation { get; set; }
        public virtual ICollection<ApiAppHistory> ApiAppHistoryReasonNavigation { get; set; }

    }
}

1 Ответов

Рейтинг:
1

Maciej Los

Что ж...

Если вы хотите получить соответствующие данные из 3 таблиц, вы должны использовать присоединиться[^].
Существует несколько типов соединения:


  • Внутреннее соединение
  • Групповое соединение
  • Левое внешнее соединение


Итак, это:
var t12 = (from r in qq
                   from b in _context.ApiAppHistory
                   from s in _context.EntityType
                   where r.LastRequest== b.Id && b.SentType == s.Id && b.Reason == s.Id && b.Status == s.Id
                   select ...

должны быть заменены на:
var t12 = (from r in qq
                   join b in _context.ApiAppHistory on r.LastRequest equals b.Id into ...
                   join s in _context.EntityType on new {b.SentType, b.Reason, b.Status} equals {s.Id, s.Id, s.Id} into ...
                   select ....


Для получения более подробной информации, пожалуйста, смотрите: Соединение с помощью составных ключей (LINQ в C#) | Microsoft Docs[^]