2013-04-14 3 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 похожее на слово 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(), который вызывает оценку выражения до сих пор. Если вы можете жить, не возвращая SQL-ошибку, если есть дубликаты в words, вы можете написать запрос как-то вроде этого;

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(); 
Смежные вопросы