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列表,其中可能有许多作曲家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并进行进一步调试。这是一个很好的响应。很高兴看到你花时间一步一步走过!谢谢你的帮助,柯克·沃尔!我用新内容编辑了原始问题。我希望你能再次帮助我。