我想知道是否有可能将IEnumerable连接在一起。
基本上我有很多用户需要从数据库中获取内容,以便我可以搜索和翻阅它。
我现在正在使用LINQ to SQL,我的代码:
public IEnumerable<content> allcontent;
//Get users friends
IEnumerable<relationship> friends = from f in db.relationships
where f.userId == int.Parse(userId)
select f;
IEnumerable<relationship> freindData = friends.ToList();
foreach (relationship r in freindData)
{
IEnumerable<content> content = from c in db.contents
where c.userId == r.userId
orderby c.contentDate descending
select c;
// This is where I need to merge everything together
}
我希望有道理!
马特
答案 0 :(得分:6)
如果我理解你想要做什么,为什么不试着这样做:
var result = from r in db.relationships
from c in db.contents
where r.userId == int.Parse(userId)
where c.userId == r.UserId
orderby c.contentDate descending
select new {
Relationship = r,
Content = c
}
这将为您提供IEnumerable<T>
,其中T
是一个匿名类型,其字段为Relationship
和Content
。
答案 1 :(得分:1)
如果您知道您的用户将少于2100位朋友,您可以轻松地将已经加载的数据中的密钥发送回数据库:
List<int> friendIds = friendData
.Select(r => r.UserId)
.Distinct()
.ToList();
List<content> result = db.contents
.Where(c => friendIds.Contains(c.userId))
.ToList();
这里发生的是Linq将每个Id转换为参数,然后构建一个IN子句来进行过滤。 2100是SQL服务器将接受的最大参数数量...如果您有超过2100个朋友,则必须打破ID列表并合并(Concat)结果列表。
或者,如果你想要一个更直接的问题答案 - Concat是一个通过创建一个新的IEnumerable将2个IEnumebles组合在一起的方法,它返回第一个项目,然后是第二个项目。
IEnumerable<content> results = Enumerable.Empty<content>();
foreach (relationship r in friendData)
{
IEnumerable<content> content = GetData(r);
results = results.Concat(content);
}
答案 2 :(得分:0)
如果您正在进行INNER加入,请查看.Intersect()
扩展方法。
答案 3 :(得分:0)
您可以使用两种主要选项:.SelectMany(...)或.Concat(...)