2010-04-28 3 views
0

J'essaie d'écrire la requête suivante dans LINQ, mais je n'arrive pas à l'obtenir correctement.Requête LINQ avec un nombre spécifié de lignes dans un problème de sous-requête

select p.* 
from Person p 
inner join PersoniPhones i ON p.PersonID = i.PersonID 
where p.PersonID in 
(
    SELECT PersonID 
    FROM 
     (
     SELECT Top 10 PersonID, iPhoneID 
     FROM iPhone 
     ORDER BY LastPlayedDate DESC 
     ) as t 
) 

J'ai essayé ce qui suit, mais il ne retourne pas correctement

 var tenIPhones = from phone in context.PersonIPhones 
         .OrderByDescending(i => i.LastPlayedDate) 
         .Take(10) 
         select new { phone.PersonID, phone.IPHoneID}; 
     var people = from p in context.Person 
       join t in tenIPhones on p.PersonID equals t.PersonID 
       select p; 

Toutes les idées?

+0

Eh bien pour une chose que vous définissez 'I' en deux endroits :) –

+0

Autre que cela, il regarde un coup d'oeil comme il devrait fonctionner correctement (notez que la jointure interne dans le SQL original n'est pas réellement employée pour n'importe quoi) –

Répondre

3

Qu'en est-

var subsetPhone = iPhones.OrderByDescending(x => x.LastPlayedDate).Take(10).Select(x => new { PersonId = x.PersonId, iPhoneId = x.iPhoneId }); 
var people = persons.Where(x => subsetPhone.Where(y => y.PersonId == x.Id).Count() > 0); 
+0

Cela a fonctionné. Merci. Je ne comprends pas pourquoi mon code ne fonctionne pas, mais cela fonctionne, donc je vais bien. – John

1

Cela fonctionne dans LINQPad avis IPhoneID et pas IPHoneID

var tenIPhones = (from i in PersoniPhones 
    .OrderByDescending(i => i.LastPlayedDate) 
    .Take(10) 
    select new { i.PersonID, i.IPhoneID}); 

tenIPhones.Dump(); 

var people = from p in Persons 
     join t in tenIPhones on p.PersonID equals t.PersonID 
     select p; 

people.Dump(); 
+0

Qu'est-ce que .Dump()? – John

+0

Si vous utilisez LinqPad, vous pouvez sortir le resultset en utilisant .Dump() - assez pratique! –

+0

L'ID n'était pas le problème. C'était juste une faute quand j'ai traduit notre code de production actuel dans un exemple de démonstration. Le problème est que le code génère le mauvais SQL et renvoie trop de lignes. – John

Questions connexes