Ошибка LINQtoSQL: операторы сравнения не поддерживаются - PullRequest
1 голос
/ 14 мая 2011

У меня небольшая проблема с кодом ниже:

    var composer =
        (from comp in db.Composers
         where comp.Composer_Name.Contains(composerTextbox.Text)
         select comp.Composer_ID);

    var song =
        (from sng in db.Songs
        where sng.Composer_ID.Equals(composer)
         select sng.Track_ID);

    var track =
        (from trk in db.Tracks
        where trk.Track_ID.Equals(song)
         select trk.CD_ID);

    e.Result =
        from result in db.CDs
        where result.CD_ID.Equals(track)
         select new { result.CD_Title };

Ошибка, которая появляется при попытке запустить код, выглядит следующим образом:

    Comparison operators not supported for type 'System.Linq.IQueryable`1[System.Int16]'.

Вот как устроена база данных:

  • CD
    • CD_ID
    • CD_Title
  • Треки
    • CD_ID
    • Track_ID
  • Песни
    • Track_ID
    • Composer_ID
  • Композиторы
    • Composer_ID
    • Composer_Name

Моя основная цель в коде - позволить пользователю искать в базе данных компакт-диски, которые были составлены человеком по их выбору.Обратите внимание, что на некоторых компакт-дисках может быть несколько композиторов, так как песни / дорожки допускают более одной записи в разделе Composer.

То, что должно быть возвращено пользователю, - это список компакт-дисков в GridView.

Буду признателен за любую помощь!


Редактировать:

Как сказал мистер Кирк Волл, я на самом деле пытаюсь вернуть списоккомпакт-дисков против, возможно, многих композиторов.

Я продолжил и обновил код, как он предложил:

    var composers =
        (from comp in db.Composers
         where comp.Composer_Name.Contains(composerTextbox.Text)
         select comp.Composer_ID).ToArray();

    var song =
        (from sng in db.Songs
        where composers.Contains(sng.Composer_ID)
        select sng.Track_ID);

Я попробовал следующее, чтобы посмотреть, выведет ли он правильный список компакт-дисков:

    var composer =
        (from comp in db.Composers
         where comp.Composer_Name.Contains(composerTextbox.Text)
         select comp.Composer_ID).ToArray();

Предполагается, что он собирает все действительные идентификаторы Composer и помещает их в массив.

    var song =
        (from sng in db.Songs
         where composer.Contains(sng.Composer_ID)
         select sng.Track_ID).ToArray();

Предполагается, что он просматривает список допустимых идентификаторов Composer и создает новый массив действительныхпесни.

    var track =
        (from trk in db.Tracks
         where song.Contains(trk.Track_ID)
         select trk.CD_ID).ToArray();

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

    e.Result =
        from result in db.CDs
        where track.Contains(result.CD_ID)
        select new { result.CD_Title };

Это должно просматривать список действительныхотслеживает и извлекает все связанные с ними заголовки компакт-дисков.

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

1 Ответ

2 голосов
/ 14 мая 2011

Это утверждение:

var composer =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID);

Возвращает IQueryable<short>. Другими словами, это можно переписать как:

IQueryable<short> composer =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID);

Эта строка:

var song =
    (from sng in db.Songs
    where sng.Composer_ID.Equals(composer)
     select sng.Track_ID);

Пытается провести сравнение между Composer_ID (предположительно short) и composer (типа IQueryable<short>). Очевидно, это не сработает.

Возможно, ваше первое утверждение должно выглядеть так:

var composer =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID).FirstOrDefault();

Обратите внимание на .FirstOrDefault(), который мы добавили - это гарантирует, что ваш запрос возвращает одно значение short и обеспечивает сравнение между short и short, поэтому следует устранить проблему.

Потенциально вы действительно хотите сравнить с, возможно, многими идентификаторами композиторов (т. Е. Со всеми композиторами, у которых есть имя, содержащее указанный текст), и в этом случае его следует переписать как:

var composers =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID).ToArray();

Теперь у нас есть массив допустимых идентификаторов композитора. Мы можем переписать вторую часть для запроса к этому массиву:

var song =
    (from sng in db.Songs
    where composers.Contains(sng.Composer_ID)
    select sng.Track_ID);

Это вернет все песни, которые имеют идентификатор композитора, содержащийся в предыдущем массиве идентификаторов composers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...