代码之家  ›  专栏  ›  技术社区  ›  Tom Lianza

linq:使用associatewith和distinct在一起

  •  2
  • Tom Lianza  · 技术社区  · 17 年前

    我还没有找到把这两个元素结合起来的方法。

    这是我的问题:

    一个网页有许多书签。用户拥有书签。用户可以多次对同一页面进行书签(出于我的目的)。

    我想要的是一个页面书签的不同用户列表。我想用 LoadWith() AssociateWith() 方法 DataContext ,因为我不想每次都编写一个全新的查询,因为我需要数据的一个小变体。所以,有时候我想要一个页面,有时候我想要一个页面和一个书签列表,等等。

    我可以有这样的代码,让我得到页面和书签:

    dlo.LoadWith<Page>(p => p.Bookmarks);
    

    添加此项以获取用户:

    dlo.LoadWith<Bookmark>(b => b.User); 
    

    但我不知道如何限制用户的区别。我想是通过 关联() 命令,但这不支持 Distinct() 操作员: http://msdn.microsoft.com/en-us/library/bb548919.aspx

    我正在做的是可能的,还是必须为它编写一个新的查询?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Amy B    17 年前

    假设有两个页面和两个用户,并且两个用户都为这两个页面添加了书签。

    如果你发出

    dlo.LoadWith<Page>(p => p.Bookmarks);
    dlo.LoadWith<Bookmark>(b => b.User);
    dc.DataLoadOptions = dlo;
    List<Page> myPages = dc.Page.ToList();
    

    然后linqtosql将加载2个页面、4个书签和2个用户,并构建预期的对象图。

    然后,要在不影响数据库的情况下获得不同的用户,必须遍历图形并执行以下操作:

    List<User> myUsers = myPages
      .SelectMany(p => p.Bookmarks)
      .Select(b => b.User)
      .Distinct()
      .ToList()
    

    在这种情况下,用户可以多次在同一页面上书签,因此它们不明显。

    好吧,这是一张未经测试的照片。

    List<PageWithUsers> myPages = dc.Pages
      .Select(p => new PageWithUsers()
      {
        Page = p
        Users = p.Bookmarks
          .Select(b => b.UserId)
          .Distinct()
          .Take(10)
          .Select(i => dc.Users.Where(u => u.UserId = i))
      })
      .ToList();
    
    推荐文章