Подтвердить что ты не робот

Подзапрос Entity Framework

Ребята Я новичок в Entity Framework, и у меня есть проблема, которую я пытаюсь решить довольно долго. В основном у меня есть 4 объекта: пользователи, группы, книги и списки чтения. Пользователь может присоединиться к группе, а группа содержит книги, определенные с помощью readList. Я пытаюсь отобразить список книг для определенной группы, SQL выглядит следующим образом:

SELECT * FROM Books b
WHERE b.Id IN (
    SELECT BookID FROM ReadingList rl
        WHERE rl.GroupID = '3')

Я определяю поиск GroupID путем запроса текущего пользователя из UserRepository, и в настоящее время метод get get by group выглядит следующим образом:

// Get books by group
public IQueryable<Book> GetGroupBooks(string username)
{
    UserRepository userRepository = new UserRepository();
    int groupId = userRepository.GetUserGroupId(username);

    IQueryable<Book> q = from b in entities.Books 
                         where b.Id == 7 // temp - these values should be determined by 
                                         // rl in entites.ReadingList select rl.BookID where r.GroupID == groupID
                         select b;

    return q;
}

Очевидно, что это временная мера и возвращает только одну книгу, но я включил ее для справки. Любая помощь или совет здесь будут высоко оценены.

Спасибо

4b9b3361

Ответ 1

Я не тестировал его, но надеюсь, что он сработает.

entities.Books.Where(
b => entities.ReadingList.
Where(rl => rl.GroupId == groupId).
Select(rl => rl.BookId).
Contains(b.BookId)
)

Ответ 2

Лично я думаю, что есть лучшее решение (конечно же, не проверено):

Сначала выберите из ReadList по GroupdID, затем присоединитесь к книгам BookID.

IQueryable<Book> q = 
       from rl in entities.ReadingList
       join b in entities.Books on rl.BookID equals b.BookID
       where rl.GroupdID ==groupID
       select b;

var books = q.ToList()

Пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы.