Linq加入 - 重复

时间:2009-10-22 17:49:45

标签: c# .net asp.net sql

我有两张桌子。

1.Users table(用户名,名称)

2.Picture table(ID,Username,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
          };

这可以工作但返回重复的用户行。 (如果用户有多张照片)。

我希望每个用户获得一行。 这可能吗?

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

您可以使用分组:

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

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

答案 2 :(得分:1)

你应该把IsPrimary放在where条件下。另外,由于用户可以没有图片,因此您需要左连接。

编辑:exmaple正在关注,(可能有拼写错误)

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的答案似乎没有给出你要求的答案。

答案 3 :(得分: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 ? "(No picture)" : o.Id ) };