如何加入2个通用IEnumerator

时间:2009-08-17 21:01:21

标签: c# asp.net linq

我想知道是否有可能将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
        }

我希望有道理!

马特

4 个答案:

答案 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是一个匿名类型,其字段为RelationshipContent

答案 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(...)