2010-11-23 42 views
4

我試圖在LINQ中實現where in (select ...)代碼的T-SQL等效項。LINQ:分組依據+在哪裏在條款

這是我現在有:

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 
        }; 

然而,我的代碼不會編譯由於這種錯誤的ToList()

無法從 'System.Linq.IQueryable<AnonymousType#1>' 轉換 到 'System.Collections.Generic.IEnumerable<string>'

A對於如何實現這個,有什麼建議嗎?或者有關如何簡化此代碼的任何建議?

+0

你並不需要在`group`條款創建匿名類型。 – SLaks 2010-11-23 02:08:52

回答

13

您的查詢返回一組匿名類型;您不能將其隱式轉換爲List<string>

相反,您應該選擇字符串本身。你不需要任何匿名類型。

將其更改爲

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

很好,謝謝! – Dean 2010-11-23 14:37:00