Database LINQtoSQL错误:不支持比较运算符

Database LINQtoSQL错误:不支持比较运算符,database,linq-to-sql,Database,Linq To Sql,下面的代码有点问题: 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(co

下面的代码有点问题:

    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_标题
  • 曲目
    • CD_ID
    • 跟踪ID
  • 歌曲
    • 跟踪ID
    • 作曲家
  • 作曲家
    • 作曲家
    • 作曲家姓名
我在代码中的主要目标是允许用户在数据库中搜索由他们选择的人创作的CD。请注意,有些CD可能有多个作曲家,因为歌曲/曲目允许作曲家部分有多个条目

应该返回给用户的是GridView中的CD列表

任何帮助都将不胜感激


编辑:

正如柯克·沃尔先生所说,我实际上想做的是返回一张CD列表,其中可能有许多作曲家ID

我已经按照他的建议继续更新了代码:

    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);
我尝试了以下方法,以查看它是否能提供正确的CD列表:

    var composer =
        (from comp in db.Composers
         where comp.Composer_Name.Contains(composerTextbox.Text)
         select comp.Composer_ID).ToArray();
这应该获取所有有效的Composer ID并将它们放入一个数组中

    var song =
        (from sng in db.Songs
         where composer.Contains(sng.Composer_ID)
         select sng.Track_ID).ToArray();
这是为了查看有效作曲家ID的列表,并生成一个新的有效歌曲数组

    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 };
这是为了查看有效曲目列表并提取与之相关的所有CD标题

我尝试运行代码,没有异常,但搜索中返回的唯一结果是数据库中的第一张CD。任何搜索新作曲家的尝试都只返回相同的CD。

此语句:

var composer =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID);
返回一个
IQueryable
。换句话说,它可以改写为:

IQueryable<short> composer =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID);
var composers =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID).ToArray();
尝试在
Composer\u ID
(可能是
short
)和
Composer
(类型为
IQueryable
)之间进行比较。显然,这行不通

也许你的第一句话应该是这样的:

var composer =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID).FirstOrDefault();
注意我们添加的
.FirstOrDefault()
——这确保查询返回单个
short
值,并确保比较是在
short
short
之间进行的,因此应该解决问题

您可能真的想与许多作曲家ID(即具有包含指定文本的名称的所有作曲家)进行比较,在这种情况下,应该将其重写为:

IQueryable<short> composer =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID);
var composers =
    (from comp in db.Composers
     where comp.Composer_Name.Contains(composerTextbox.Text)
     select comp.Composer_ID).ToArray();
现在我们有了一个有效的作曲家ID数组。我们可以重写第二部分来查询该数组:

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

这将返回在前面的
composers
id数组中包含作曲家id的所有歌曲。

这会引发第一个查询吗?我看到了您的编辑,但如果您没有返回任何行,则调试将更加困难。我建议您尝试直接在SSMS中运行它,并首先调试原始SQL。一旦您弄清楚需要在那里更改什么,我们应该能够返回到您的LinqToSql并进行进一步调试。这是一个很好的响应。很高兴看到你花时间一步一步走过!谢谢你的帮助,柯克·沃尔!我用新内容编辑了原始问题。我希望你能再次帮助我。