2011-05-13 64 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