LINQ:分组依据+在哪里在条款
问题描述:
我试图在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对于如何实现这个,有什么建议吗?或者有关如何简化此代码的任何建议?
答
您的查询返回一组匿名类型;您不能将其隐式转换为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
你并不需要在`group`条款创建匿名类型。 – SLaks 2010-11-23 02:08:52