Как объединить несколько моделей в одну с помощью linq

У меня есть модель SecurityLog, возвращающая строки из базы данных SQL. У меня также есть таблица SecurityLogOfficer и Officer, которая содержит отношения многие-многие.

Как я могу объединить модели и отобразить объединенный список имен офицеров?

IQueryable<SecurityLog> sort = from s in _context.SecurityLog                                      
                                  .Include(f => f.SecurityLogOfficers)
                                  .ThenInclude(e => e.Officer)
                                  //.Select(x => new PageViewModel
                                  //{ OfficersNames = string.Join(",", x.SecurityLogOfficers.Select(o => o.Officer.FullName)) })
                         select s;

По сути, я хотел бы взять мой список SecurityLogOfficers и вывести список имен офицеров в одну строку (через запятую)

введите описание изображения здесь

Обновление 02/11/20

@foreach (var item in Model.SecurityLog)
{
    <tr>
        <td style="width:4% !important">
            @Html.DisplayFor(modelItem => item.ID)
        </td>
        <td style="width:5% !important">
            @Html.DisplayFor(modelItem => item.EventDate)
        </td>


        <td style="width:5% !important">
            @Model.OfficerNames[i]
}

Модель индексной страницы

public class PageViewModel
{            
    public List<string> OfficerNames { get; internal set; }
}

Это дает явную ошибку преобразования ....

IQueryable<SecurityLog> sort = from s in _context.SecurityLog
                                        .Include(a => a.Entity)
                                        .Include(b => b.EventType)
                                        .Include(c => c.Location)
                                        .Include(d => d.ShiftRange)
                                        .Include(f => f.SecurityLogOfficers)
                                        .ThenInclude(e => e.Officer)
                                        .Select(x => new PageViewModel
                                        { OfficerNames = string.Join(",", x.SecurityLogOfficers.Select(o => o.Officer.FullName)) })
                                       select s;

 if (!String.IsNullOrEmpty(searchString))
        {
            sort = sort.Where(s => s.Narrative.Contains(searchString)                
                                || s.SubjectFirst.Contains(searchString)
                                || s.SubjectLast.Contains(searchString)
                                || s.OfficerNames.Contains(searchString));


        }

SecurityLog = await PaginatedList<SecurityLog>.CreateAsync(sort
            .Include(a => a.Entity)
            .Include(b => b.EventType)
            .Include(c => c.Location)
            .Include(d => d.ShiftRange)
            .Include(e => e.Officer)
            .Include(f => f.SecurityLogOfficers)
            .AsNoTracking(), pageIndex ?? 1, pageSize);

Всего 2 ответа


Вот рабочая демонстрация, на которую вы можете сослаться:

1.Model:

public class SecurityLog
{
    public int SecurityLogId { get; set; }
    public string Name { get; set; }
    public IList<SecurityLogOfficers> SecurityLogOfficers { get; set; }
}
public class Officer
{
    public int OfficerId { get; set; }
    public string Active { get; set; }
    public string FullName { get; set; }
    public IList<SecurityLogOfficers> SecurityLogOfficers { get; set; }
}
public class SecurityLogOfficers
{
    public int OfficerId { get; set; }
    public Officer Officer { get; set; }
    public int SecurityLogId { get; set; }
    public SecurityLog SecurityLog { get; set; }
}

2.Index.cshtml:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.SecurityLog[0].Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.SecurityLog[0].SecurityLogOfficers[0].Officer.FullName)
            </th>
        </tr>
    </thead>
    <tbody>
    @foreach (var item in Model.SecurityLog) {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @(string.Join(",", item.SecurityLogOfficers.Select(u=>u.Officer.FullName)))              
                </td>           
            </tr>
    }
    </tbody>
</table>

3.Index.cshtml.cs:

public IList<SecurityLog> SecurityLog { get;set; }

public async Task OnGetAsync()
{
    IQueryable<SecurityLog> sort = from s in _context.SecurityLog
                                .Include(f => f.SecurityLogOfficers)
                                .ThenInclude(e => e.Officer)
                                    select s;
    SecurityLog = await sort.ToListAsync();
}

4.Result: введите описание изображения здесь


Вы должны использовать свойство display, которое будет выполнять конкатенацию или конкатенацию при отображении вашей сущности db в ViewModel (как закомментированная строка в вашем примере). Учитывая, что это, вероятно, только для целей отображения, вы не должны использовать эту логику на уровне БД imo.


Есть идеи?

10000