【问题标题】:Linq Join - DuplicatesLinq 加入 - 重复
【发布时间】:2010-12-09 04:40:30
【问题描述】:

我有两张桌子。

1.Users表(用户名、姓名)

2.图片表(ID、用户名、IsPrimary)

每个用户可以拥有零到多张图片。

我正在尝试编写一个查询,它将返回所有用户(有或没有图片)和单个图片 ID(IsPrimary = true 的图片) .

我写了这个 Linq 查询:

var v = from u in Users
    join p in Photos on u.Username equals p.Username 
    select new
    {
     u.Username,
     p.ID
          };

这可行,但会返回重复的用户行。 (如果用户有不止一张照片)。

我想为每个用户获取一行。 这可能吗?

【问题讨论】:

    标签: c# .net asp.net sql


    【解决方案1】:

    这应该完全符合您的要求。

    from u in Users
    let p = Photos.Where(p => p.Username == u.Username).FirstOrDefault()
    where p <> null
    select new
    {
        u.Username,
        p.ID
    };
    

    但是,值得注意的是,您最好编写手动优化的 SQL 并使用 db.ExecuteQuery&lt;User&gt; 或类似方法检索对象。

    【讨论】:

    • 不,不是。它应该做得很好;但是,它似乎有点不稳定。
    【解决方案2】:

    你可以使用分组:

    from p in photos
    group p by p.username into g
    select new
        {
         Username = g.Key,
         PicId = g.First().Id
        };
    

    你可以做一些其他过滤而不是 First()...

    【讨论】:

    • 这个应该和我的加入代码一起使用还是作为一个独立的? lz能写出完整的代码吗?
    • 你的加入代码没有用,因为你只是从用户表中获取用户名,而图片表已经有了这个。利用这种情况。
    • 我明白了。但是这个查询不能让我选择 certian users 。我想首先根据几个参数选择用户(比如说用户名>1000),然后为每个用户获取一张照片。
    【解决方案3】:

    您应该将 IsPrimary 置于 where 条件中。另外,由于用户可以拥有零张图片,因此您需要左连接。

    编辑:示例如下,(可能有错字)

    from u in Users
    join p in (from p1 in Pictures where p1.IsPrimary select p1) on u.Username equals p.Username into pp
    from p in pp.DefaultIfEmpty()
    select new
    {
      u.UserName,
      PicturePath = p == null ? "DummyPath" : p.PicturePath
    }
    

    编辑:顺便说一句,John Gietzen 的回答似乎没有给出你所要求的答案。

    【讨论】:

    • 有机会给我举个例子吗?请。
    【解决方案4】:

    var upic = from u in users 在图片上加入p u.UserName 等于p.UserName 成g 从 g.DefaultIfEmpty() 中的 o 其中 o == null || o.IsPrimary == 真 select new { UserName = u.UserName, Id = ( o == null ? "(无图片)" : o.Id ) };

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多