【问题标题】:LINQ: Using AssociateWith and Distinct togetherLINQ:一起使用 AssociateWith 和 Distinct
【发布时间】:2009-01-25 02:38:08
【问题描述】:

我还没有找到同时使用这两个元素的方法。

这是我的问题:

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

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

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

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

并添加此以获取我的用户:

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

但我不知道如何将用户限制为不同的。我假设它是通过AssociateWith() 命令,但不支持Distinct() 运算符:http://msdn.microsoft.com/en-us/library/bb548919.aspx

我正在做的事情是否可行,还是我必须为此编写一个新查询?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

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

    如果你发出

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

    【讨论】:

    • 我实际上是在尝试让数据库执行 DISTINCT,因为(很抱歉没有说明这一点)我也想限制用户。所以,我不能让数据库将用户限制为 10 个,然后如果我做一个 Distinct 可能会给我留下 8 个用户,而我真的想要 10 个。
    • 所以……你可以接受,但你不能区分……嗯。你真的需要区分吗?这意味着您的用户表中有真正的重复项(并且没有主键)。如果是这种情况,我会将主键应用于用户表。
    • 我在用户表上有一个主键,只是在这种情况下用户可以多次为同一页面添加书签,因此它们并不不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多