2011-05-13 67 views
1

我有一点与下面的代码有问题的:LINQtoSQL错误:比较运营商不支持

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_ID
    • CD_Title
  • 曲目
    • CD_ID
    • Track_ID
  • 歌曲
    • Track_ID
    • Composer_ID
  • 作曲家
    • Composer_ID
    • Composer_Name

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

应该返回给用户的是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); 

我尝试以下,看它是否会弹出光盘的正确的列表:

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。

+0

这是抛出第一个查询? – IAbstract 2011-05-13 23:12:19

+0

我看到了您的编辑,但是如果您没有收回任何行,调试将会更加棘手。我建议你[调试SQL输出](http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11),并尝试直接在SSMS中运行它,并首先调试原始SQL。一旦找出需要改变的地方,我们应该能够回到LinqToSql并进一步调试。 – 2011-05-14 02:54:02

回答

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数组ids的作曲家ID的任何歌曲。

+0

这是一个很好的回应。很高兴看到你花时间一步一步走过! – Yuck 2011-05-13 23:31:47

+0

感谢您的帮助,Kirk Woll!我用新内容编辑了原始问题。我希望你能再次帮助我。 – 2011-05-14 01:00:20