LINQ:一起使用AssociateWith和Distinct

时间:2009-01-25 02:38:09

标签: c# .net linq

我还没有找到将这两个元素结合使用的方法。

这是我的问题:

网页上有很多书签。用户拥有书签。用户可以多次为同一页面添加书签(为了我的目的)。

我想要的是为页面添加书签的不同用户的列表。我正在尝试使用LoadWith()的{​​{1}}和AssociateWith()方法,因为我不想每当我想要一个轻微的数据变体时都要写一个全新的查询。所以,有时我想要一个页面,有时候我想要一个页面和一个书签列表等等。

我可以使用这样的代码来获取页面和它的书签:

DataContext

并添加此内容以吸引用户:

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

但我不知道如何限制用户与众不同。我假设它是通过dlo.LoadWith<Bookmark>(b => b.User); 命令,但不支持AssociateWith()运算符:http://msdn.microsoft.com/en-us/library/bb548919.aspx

我正在做什么,或者我将不得不为它写一个新的查询?

1 个答案:

答案 0 :(得分:0)

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

如果您发出

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();