LINQ:Group By + Where in子句

Dea*_*ean 3 linq linq-to-sql

我正在尝试where in (select ...)在LINQ中实现T-SQL等效代码.

这就是我现在拥有的:

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
                     };
Run Code Online (Sandbox Code Playgroud)

但是,由于以下错误,我的代码将无法编译ToList():

无法从' System.Linq.IQueryable<AnonymousType#1>' 转换为' System.Collections.Generic.IEnumerable<string>'

有人对如何实现这个有任何建议吗?或者有关如何简化此代码的任何建议?

SLa*_*aks 12

您的查询返回一组匿名类型; 你不能隐含地将它转换为.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()
             };
Run Code Online (Sandbox Code Playgroud)