Я загружаю IQueryable книг из таблицы Books, и есть другая таблица с именем BookLoans. У меня есть DateTime? свойство в моей ViewModel с именем Availability. Я пытаюсь выяснить, как лучше всего выйти во время моего оператора select и посмотреть, появляется ли текущая книга BookID в записи в таблице BookLoans и если DateTime? переменная с именем ReturnedWhen также имеет значение NULL в этой записи. В основном я пытаюсь пометить книгу как доступную или проверенную, когда я заполняю IQueryable.Проверьте значение из второй таблицы в операторе LINQ
Было высказано предположение, что я пытаюсь сделать все это как один оператор LINQ, но я пытаюсь выяснить, будет ли проще просто заполнять книги следующим образом, а затем запускать их через цикл foreach? Также было предложено, что Join будет работать, но на самом деле я просто пытаюсь найти лучший метод, а затем, как это сделать.
var books =
_context.Books
.Select(r => new BookIndexViewModel
{
BookID = r.BookID,
Title = r.Title,
Author = r.Author,
ISBN = r.ISBN,
GenreName = r.Genre.Name
}).ToList();
Книга Entity:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Open_School_Library.Data.Entities
{
public class Book
{
public int BookID { get; set; }
public string Title { get; set; }
public string SubTitle { get; set; }
public string Author { get; set; }
public int GenreID { get; set; }
public int DeweyID { get; set; }
public int ISBN { get; set; }
public Genre Genre { get; set; }
public Dewey Dewey { get; set; }
public virtual BookLoan BookLoan { get; set; }
}
}
BookLoan Entity:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Open_School_Library.Data.Entities
{
public class BookLoan
{
public int BookLoanID { get; set; }
public int BookID { get; set; }
public int StudentID { get; set; }
public DateTime CheckedOutWhen { get; set; }
public DateTime DueWhen { get; set; }
public DateTime? ReturnedWhen { get; set; }
public Book Book { get; set; }
public Student Student { get; set; }
}
}
BookIndexViewModel:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Open_School_Library.Models.BookViewModels
{
public class BookIndexViewModel
{
public int BookID { get; set; }
public string Title { get; set; }
[Display(Name = "Author")]
public string Author { get; set; }
[Display(Name = "Genre")]
public string GenreName { get; set; }
public int ISBN { get; set; }
public string BookLoan { get; set; }
public DateTime? Availability { get; set; }
}
}
Я получил его и работает, но я не буду лгать, я не совсем понимаю, что происходит в операторе LINQ, и я был интересно, можете ли вы сломать это для меня? –
@ ChristopherJohnson См. Разбивку Я добавил к ответу и дайте мне знать, если это вообще поможет. Запросы LINQ могут быть очень сложными и трудными для чтения. –
работает замечательно. Мне было интересно, что мне нужно сделать, чтобы сделать эту работу для одного запроса? Я надеялся повторно использовать или модифицировать это в представлении деталей, в котором я использовал '.FirstOrDefault()', а также для фильтрации с помощью 'Where whatever.BookId == id'. –