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

时间:2011-05-13 22:53:20

标签: 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(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

我在代码中的主要目标是允许用户在数据库中搜索由他们选择的人员组成的CD。请注意,某些CD可能有多个作曲家,因为歌曲/曲目允许在作曲家部分中有多个条目。

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

任何帮助都将不胜感激!


编辑:

正如Kirk Woll先生所说,我实际上要做的是返回可能有很多作曲家ID的CD列表。

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

    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();

这应该查看有效的Composer 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。

1 个答案:

答案 0 :(得分:2)

本声明:

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值并确保比较在shortshort之间,因此应该解决问题。

可能你真的想要与可能的许多作曲家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的所有歌曲。