2013-04-14 112 views
0

我有以下查詢在sql編寫SQL查詢來LINQ

SELECT [definition],[pos] 
    FROM [WordNet].[dbo].[synsets] 
    where synsetid in(SELECT [synsetid] FROM [WordNet].[dbo].[senses] 
    where wordid = (select [wordid]FROM [WordNet].[dbo].[words] 
    where lemma = 'searchString')) 

我已經試過這對於SQL到LINQ:

long x = 0; 

if (!String.IsNullOrEmpty(searchString)) 
{ 
    var word = from w in db.words 
       where w.lemma == searchString 
       select w.wordId; 
    x = word.First(); 

    var sence = from s in db.senses 
       where (s.senseId == x) 
       select s; 
    var synset = from syn in db.synsets 
       where sence.Contains(syn.synsetId) 
       select syn; 

但我在sence.Contains()

得到以下錯誤
Error1:Instance argument: cannot convert from 
    'System.Linq.IQueryable<WordNetFinal.Models.sense>' to 
    'System.Linq.ParallelQuery<int>' 
+0

請仔細閱讀http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title –

+1

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

x似乎是Word t ype,它不是Id的類型(可能是int或long)。

2

下面的代碼:

var sence = from s in db.senses 
       where (s.senseId == x) 
       select s; 

類型的返回對象:WordNetFinal.Models.sense,但在where sence.Contains(syn.synsetId)你想在它syn.synsetId搜索是一個整數。

所以,你應該上面的代碼更改爲:

var sence = from s in db.senses 
        where (s.senseId == x) 
        select s.senseId; 
0

你比較整個sense行了synsetId,這是不正確的。您還通過使用First()將原始查詢拆分爲兩個單獨的查詢,這些查詢觸發了迄今爲止對錶達式的評估。如果您可以忍受如果在words中存在重複的情況下不返回SQL錯誤,則可以將查詢編寫爲這樣的內容;

if (!String.IsNullOrEmpty(searchString)) 
{ 
    var wordIds = from word in db.words 
        where word.lemma == searchString 
        select word.wordId; 

    var synsetIds = from sense in db.senses 
        where wordIds.Contains(sense.wordId) 
        select sense.synsetId; 

    var result = (from synset in db.synsets 
        where synsetIds.Contains(synset.synsetId) 
        select new {synset.definition, synset.pos}).ToList(); 
} 

ToList()爲整個查詢觸發評估一次。

你也可以使用簡單的連接來做到這一點;

var result = (from synset in db.synsets 
       join sense in db.senses on synset.synsetId equals sense.synsetId 
       join word in db.words on sense.wordId equals word.wordId 
       select new {synset.definition, synset.pos}).ToList();