На главной странице указателя я хотел бы отобразить список сотрудников в столбце «Имя сотрудника». то есть Томми Багамские Острова, Клинтон К. и др. c ...
У меня возникли трудности, поскольку таблица Officer и SecurityLogOfficer не являются частью моей модели SecurityLog на странице индекса.
Страница индекса SecurityLog
@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">
@Html.DisplayFor(modelItem => item.OfficerList)
</td>
}
Я создал класс OfficerList для возврата списка разделенных запятыми офицеров, но у меня возникают проблемы с отображением этого на странице индекса SecurityLog.
public class OfficerList : SecurityLog
{
private readonly SecurityCore.Models.SecurityCoreContext _context;
public OfficerList(SecurityCore.Models.SecurityCoreContext context)
{
_context = context;
}
public List<string> GetOfficerList()
{
List<string> OfficerIDs = new List<string>();
//use the syntax .ToList() to convert object read from db to list to avoid being re-read again
var SecLog = _context.SecurityLog.ToList();
var SecLogOfficer = _context.SecurityLogOfficer.ToList();
var Officer = _context.Officer.ToList();
int rowID;
//string[] OfficerIDs = new string[100];
rowID = 0;
foreach (SecurityLog sl in SecLog)
{
foreach (SecurityLogOfficer slo in SecLogOfficer.Where(slo => slo.SecurityLogID == sl.ID))
{
if (OfficerIDs[rowID] == null)
{
OfficerIDs[rowID] = slo.Officer.FullName + ", ";
}
else
{
OfficerIDs[rowID] = OfficerIDs[rowID] + slo.Officer.FullName + ", ";
}
}
rowID++;
}
return OfficerIDs;
}
}
Здесь я хотел бы отобразить составной список ...
А вот моя схема базы данных и пример результаты
Любая помощь будет принята с благодарностью. Спасибо!
ОБНОВЛЕНИЕ
У меня проблема с получением списка составных имен в моей модели SecurityLog.
public class SecurityLog
{
private readonly SecurityCore.Models.SecurityCoreContext _context;
public SecurityLog(SecurityCore.Models.SecurityCoreContext context)
{
_context = context;
}
......
public List<string> OfficerList
{
get
{
var officerList = new OfficerList(_context);
return officerList.GetOfficerList();
}
}
}
Изменено Класс OfficerList
public class OfficerList : SecurityLog
{
private readonly SecurityCore.Models.SecurityCoreContext _context;
public OfficerList(SecurityCoreContext context) : base(context)
{
_context = context;
}
public List<string> GetOfficerList()
{
List<string> OfficerIDs = new List<string>();
//use the syntax .ToList() to convert object read from db to list to avoid being re-read again
var SecLog = _context.SecurityLog.ToList();
var SecLogOfficer = _context.SecurityLogOfficer.ToList();
var Officer = _context.Officer.ToList();
int rowID;
//string[] OfficerIDs = new string[100];
rowID = 0;
foreach (SecurityLog sl in SecLog)
{
foreach (SecurityLogOfficer slo in SecLogOfficer.Where(slo => slo.SecurityLogID == sl.ID))
{
if (OfficerIDs[rowID] == null)
{
OfficerIDs[rowID] = slo.Officer.FullName + ", ";
}
else
{
OfficerIDs[rowID] = OfficerIDs[rowID] + slo.Officer.FullName + ", ";
}
}
rowID++;
}
return OfficerIDs;
}
}
Мой _context для SecurityLog говорит, что он нулевой.
SqlNullValueException: данные равны нулю. Этот метод или свойство нельзя вызывать для значений Null. Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull () Microsoft.Data.SqlClient.SqlBuffer.get_DateTime () Microsoft.Data.SqlClient.SqlDataReader. ) Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable + Enumerator.MoveNext () System.Collections.Generi c .List..ctor (IEnumerable collection) System.Linq.Enumerable.ToList (IEnumerable source) SecurityCore.Models. SecurityCore.Models. GetOfficerList () в OfficerList.cs + var SecLog = _context.SecurityLog.ToList (); SecurityCore.Models.SecurityLog.get_OfficerList () в SecurityLog.cs + return employeeList.GetOfficerList (); Microsoft.AspNetCore. Mvc .ViewFeatures.ExpressionMetadataProvider + <> c__DisplayClass0_0.g__modelAccessor | 0 (контейнер объектов). Microsoft.AspNetCore. Mvc .ViewFeatures.ModelExplorer.get_Model () Microsoft.AeSe. ctor (IViewEngine viewEngine, IViewBufferScope bufferScope, ViewContext viewContext, ViewDataDictionary viewData, ModelExplorer modelExplorer, строка htmlFieldName, строка templateName, bool readOnly, объект AdditionalViewData) Microsoft.AspNetCore. stringFlay.HelE.GerF. templateName, объект AdditionalViewData) Microsoft.AspNetCore. Mvc .ViewFeatures.HtmlHelper.DisplayFor (выражение> выражение, строка templateName, строка htmlFieldName, объект AdditionalViewData) Microsoft.AspNetCore. Mvc .Rendering.HtmlHelperDisplayExperressionHHperperHisplayHerperHisperHerperHisperHerperHisperHerperHisperHerperHisperHerperHisperHerperHisperHerperHisperHerperHerplayHeperHellHellHellHellHellHellHellHellHerHerHerHerperHerperHerperHerperHerperHerperHerperHerperHerperHerperHerperHelperHer > выражение) SecurityCore.Pages.SecurityLogs.Pages_SecurityLogs_Index.ExecuteAsyn c () в Index.cshtml + @ Html .DisplayFor (modelItem => item.OfficerList) Microsoft.AspNetCore. Mvc .Razor.RazorView.RenderPageCoreAsyn c (страница IRazorPage, контекст представления контекста) Microsoft.AspNetCore. Mvc .Razor.RazorView.RenderPageAsyn c (страница IRazorPage, контекст ViewContext, bool invokeViewStarts) Microsoft.AspNetCore. Mvc .Razor.RazorView.RenderAsyn c (контекст ViewContext) Microsoft.AspNetCore. * 10at *. .ViewExecutor.ExecuteAsyn c (ViewContext viewContext, строка contentType, Nullable statusCode) Microsoft.AspNetCore. Mvc .ViewFeatures.ViewExecutor.ExecuteAsyn c (ViewContext viewContext, строка contentType, Nullable statusCoreCode.Code). .Infrastructure.ResourceInvoker.g__Awaited | 29_0 (ResourceInvoker invoker, Task LastTask, State next, Область действия, состояние объекта, bool isCompleted) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.Rethrow (ResultExecutedContext.ealed context.e2. Context.ealedNet) .Cecaled context.ealedNet) .Console.). * .Infrastructure. ResourceInvoker.ResultNext (ref State next, ref Область действия, ref object object, ref bool isCompleted). Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.InvokeResultFilters () Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker__ (ResourceInvoker invoker, Task lastTask, State next, Область действия, состояние объекта, bool isCompleted). Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.Rethrow (контекст ResourceExecutedContextSealed) Microsoft.AspNetCore. Mvc .Infrastructure.Resource. ref State next, ref Область действия, состояние объекта ref, ref bool isCompleted) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 19_0 (Вызов ResourceInvoker, задача lastTask, следующее состояние, область действия Scope, состояние объекта, bool isCompleted) Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Logged | 17_1 (ResourceInvoker invoker) Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask | 6_0 (конечная точка конечной точки, задача requestTask, ILogger logger) Micros t.AspNetCore.Authorization.AuthorizationMiddleware.Invoke (контекст HttpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)
ОБНОВЛЕНИЕ 1052 public class SecurityCoreContext : DbContext
{
public SecurityCoreContext (DbContextOptions<SecurityCoreContext> options)
: base(options)
{
}
public DbSet<SecurityCore.Models.SecurityLog> SecurityLog { get; set; }
public DbSet<SecurityCore.Models.Entity> Entity { get; set; }
public DbSet<SecurityCore.Models.Location> Location { get; set; }
public DbSet<SecurityCore.Models.ShiftRange> ShiftRange { get; set; }
public DbSet<SecurityCore.Models.EventType> EventType { get; set; }
public DbSet<SecurityCore.Models.SecurityLogOfficer> SecurityLogOfficer { get; set; }
public DbSet<SecurityCore.Models.Officer> Officer { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SecurityLogOfficer>()
.HasKey(t => new { t.SecurityLogID, t.OfficerID });
modelBuilder.Entity<SecurityLogOfficer>()
.HasOne(pt => pt.SecurityLog)
.WithMany(p => p.SecurityLogOfficers)
.HasForeignKey(pt => pt.SecurityLogID);
modelBuilder.Entity<SecurityLogOfficer>()
.HasOne(pt => pt.Officer)
.WithMany(t => t.SecurityLogOfficers)
.HasForeignKey(pt => pt.OfficerID);
}
}
ОБНОВЛЕНИЕ 1/23/2020
Я попытался обновить код, основываясь на ответе ниже, и я думаю, что это действительно близко к решению; внутри класса OfficerList в настоящее время нет значения для SecLog b / c нет данных о загрузке страницы, пока не нажата кнопка поиска.
OfficerList officerList = new OfficerList();
OfficerLists = officerList.GetOfficerList(_context);
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)
.AsNoTracking(), pageIndex ?? 1, pageSize);
Это значение равно нулю при переходе к Класс OfficerList
var SecLog = _context.SecurityLog.ToList();
SqlNullValueException: данные равны нулю. Этот метод или свойство нельзя вызывать для значений Null. Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull () Microsoft.Data.SqlClient.SqlBuffer.get_DateTime () Microsoft.Data.SqlClient.SqlDataReader. ) Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable + Enumerator.MoveNext () System.Collections.Generi c .List..ctor (IEnumerable collection) System.Linq.Enumerable.ToList (IEnumerable source) SecurityCore.Models. SecurityCore.Models. GetOfficerList (SecurityCoreContext _context) в OfficerList.cs + var SecLog = _context.SecurityLog.ToList (); SecurityCore.Pages.SecurityLogs.IndexModel.OnGetAsyn c (строка sortOrder, строка currentFilter, строка searchString, Nullable pageIndex, строка entitySelect, строка entityFilter, DateTime dateBegin, DateTime dateBeginSelect, DateTime dateEnd.In DateSide * DateSime * DateNime12, DateSime * 12) в DateTime DateDend, DateSime * 11 в DateTime, DateTime, 1112) .cs + OfficerLists = employeeList.GetOfficerList (_context);
Есть ли в классе OfficerList способ не l oop через SecurityLog в foreach и каким-то образом передать идентификатор ID SecurityLog как второй параметр для OfficerList (вместе с _context)?