Linq Join - 重复项

4

我有两个表格。

1. 用户表(用户名,姓名)

2. 图片表(ID,用户名,是否为主图片)

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

我正在尝试编写一个查询,返回所有用户(无论是否有图片)和一张主图片的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
          };

这个代码可以运行,但是如果一个用户拥有多张照片,则会返回重复的用户行。

我想要每个用户只返回一行数据,这种操作是否可行?

4个回答

4
这应该能完全满足您的需求。
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<User>或类似方法检索对象。


不,其实不是。它应该能够正常工作;但是,它似乎有点不稳定。 - John Gietzen

2
您可以使用分组功能:
from p in photos
group p by p.username into g
select new
    {
     Username = g.Key,
     PicId = g.First().Id
    };

你可以使用其他筛选方法来代替 First()...


这应该跟我的连接代码一起还是作为独立的代码?请写完整的代码,好吗? - Shar
你的加入代码是无用的,因为你只是从用户表中获取用户名,而图片表已经有了这个信息。要善于利用这种情况。 - user1228
我明白了。但是这个查询不能让我选择特定的用户。 我想先根据几个参数选择用户(比如说用户名>1000),然后为每个用户获取一张照片。 - Shar

1

你应该在 where 条件中加入 IsPrimary。另外,由于用户可能没有图片,所以你需要使用左连接。

编辑:以下是示例(可能有错别字)

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的回答似乎并没有给出你所问的答案。


你能给我一个例子吗?谢谢。 - Shar

0

var upic = from u in users
           join p in pictures on u.UserName equals p.UserName into g
           from o in g.DefaultIfEmpty()
          where o == null || o.IsPrimary == true
         select new { UserName = u.UserName, Id = ( o == null ? "(没有图片)" : o.Id ) };


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接