Получить конкретные результаты из базы данных в .NET CORE - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь отобразить случайные книги на главной странице моего проекта. У каждой книги есть один или несколько авторов, но когда я повторяюсь, она показывает всех авторов (в настоящее время в базе данных) на главной странице. Не могли бы вы помочь мне понять это. Я хочу показать правильных авторов для каждой книги.

enter image description here

Когда у меня есть идентификатор в маршруте, это легко, и это работает, но я не знаю, на что ссылаться, так как у меня нет идентификатора на домашней странице.

Вот правильный индивидуальный результат enter image description here

для которого я использовал простой код ядра EF

var book = await _appDbContext.Books
                 .Include(b => b.BookAuthors)
                 .ThenInclude(a => a.Author)
                 .AsNoTracking()
                 .SingleOrDefaultAsync(m => m.BookId == id);

СЕЙЧАС для проблемы:

Я использую ViewComponent, который затем добавляю на мою домашнюю страницу

@foreach (var item in Model.BookAuthors)
{

    <span><a asp-controller="Author" asp-action="Details" asp-route-id="@item.AuthorId">@item.Author.Name</a></span>
}

Но, как я уже сказал, теперь он перебирает всех авторов в моей базе данных и не подключается к конкретным книгам.

Вот мой BookslistViewComponent.cs

public class BooksListViewComponent : ViewComponent
{
    private readonly ApplicationDbContext _appDbContext;

    public BooksListViewComponent(ApplicationDbContext appDbContext)
    {
        _appDbContext = appDbContext;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var randomBooksList = await GetRandomBooksAsync(3);

        return View(randomBooksList);
    }

    private Task<List<Book>> GetRandomBooksAsync(int numBooks)
    {
        return _appDbContext.Books.OrderBy(r => Guid.NewGuid()).Take(numBooks)
            .Include(b => b.BookAuthors)
                .ThenInclude(a => a.Author)
                .ToListAsync();


    }
}

Вот моя база данных:

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Я думаю, что ваша домашняя страница должна измениться:

@foreach (var item in Model.BookAuthors)
{
<span><a asp-controller="Author" asp-action="Details" asp-route- 
id="@item.AuthorId">@item.Name</a></span>
}
0 голосов
/ 03 мая 2018

В компоненте представления вы перебираете все Model.BookAuthors и создаете диапазон для каждого из них. Если у Model.BookAuthors есть каждый автор, как кажется, для каждого автора будет создан промежуток.

...