Linq содержит и отличается

У меня есть следующие 3 таблицы с их полями

Книги(Id_Book | Название | Год)
Book_Themes(Id | Id_Book | Id_Theme)
Темы(Id_Theme| Название)

У меня также есть массив Giud с Id_Themes

Guid [] themesArray = new Guid []{new Guid("6236c491-b4ae-4a2f-819e-06a38bf2cf41"), new Guid("06586887-7e3f-4f0a-bb17-40c86bfa76ce")};

Я пытаюсь получить все Книги, содержащие любой из Theme_Ids из themesArray

Это то, что у меня пока что не работает. Не уверен, как использовать Содержит в этом сценарии.

int index = 1; int size= 10;
var books = (from book in DB.Books
               join bookWThemes in DB.Book_Themes
               on book.Id_Book equals bookWThemes.Id_Book

               where themesArray.Contains(bookWThemes.Id_Theme)                           
               orderby book.Year
               select book)
               .Skip((index - 1) * page)
               .Take(size);

Я получаю сообщение об ошибке themesArray.Contains(bookWThemes.Id_Theme): System.Guid[] не содержит определения для Contains. Также я не уверен, где поставить Distinct

****ОБНОВЛЕНИЕ****

заметил, что моя модель имеет Id_Theme как обнуляемую... Я изменил базу данных и не отразил изменения в моей модели. Поэтому, чтобы ответить на вопрос, является ли он пустым, просто измените строку Contains на themesArray.Contains(bookWThemes.Id_Theme.Value)... и с этим изменением это работает.

Спасибо за помощь!.

3 ответа

Решение

Странно, что ваш запрос LINQ разбивается на.Contains. Все три формы IEnumerable<> и List<> работают для меня.

    [Test]
    public void Test43()
    {
        var a = new List<Guid>(){new Guid(),new Guid(),new Guid()};
        a.Contains(new Guid());  // works okay
        var b = (IEnumerable<Guid>)a;
        b.Contains<Guid>(new Guid()); // works okay
        b.Contains(new Guid()); // works okay 
    }

Для "отдельного" вопроса, позвоните сюда:

           select book)
           .Distinct()  // <--
           .Skip((index - 1) * page)

Попробуйте сыграть Guid[] в List<Guid> и тогда вы можете использовать Содержит на нем.

where themesArray.ToList().Contains(bookWThemes.Id_Theme)
Другие вопросы по тегам