2010-11-23 3 views
4

J'essaie d'implémenter un équivalent T-SQL d'un code where in (select ...) dans LINQ.LINQ: Group By + Où dans la clause

C'est ce que j'ai maintenant:

int contactID = GetContactID(); 
IEnumerable<string> threadList = (from s in pdc.Messages 
          where s.ContactID == contactID 
          group 1 by new { s.ThreadID } into d 
          select new { ThreadID = d.Key.ThreadID}).ToList<string>(); 

     var result = from s in pdc.Messages 
        where threadList.Contains(s.ThreadID) 
        group new { s } by new { s.ThreadID } into d 
        let maxMsgID = d.Where(x => x.s.ContactID != contactID).Max(x => x.s.MessageID) 
        select new { 
         LastMessage = d.Where(x => x.s.MessageID == maxMsgID).SingleOrDefault().s 
        }; 

Cependant, mon code ne compilera pas en raison de cette erreur pour le ToList():

ne peut pas convertir 'System.Linq.IQueryable<AnonymousType#1>' à 'System.Collections.Generic.IEnumerable<string>'

A nyone a des suggestions sur la façon de mettre en œuvre cela? Ou des suggestions sur la façon de simplifier ce code?

+0

Vous n'avez pas besoin de créer des types anonymes dans les clauses de 'group'. – SLaks

Répondre

13

Votre requête renvoie un ensemble de types anonymes; vous ne pouvez pas le convertir implicitement en List<string>.

Au lieu de cela, vous devez sélectionner la chaîne elle-même. Vous n'avez pas besoin de types anonymes.

Modifier à

var threadList = pdc.Messages.Where(s => s.ContactID == contactID) 
          .Select(s => s.ThreadID) 
          .Distinct() 
          .ToList(); 

var result = from s in pdc.Messages 
      where threadList.Contains(s.ThreadID) 
      group s by s.ThreadID into d 
      let maxMsgID = d.Where(x => x.ContactID != contactID).Max(x => x.MessageID) 
      select new { 
       LastMessage = d.Where(x => x.MessageID == maxMsgID).SingleOrDefault() 
      }; 
+0

Fonctionne très bien, merci! – Dean