我有两张桌子。
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
};
这可以工作但返回重复的用户行。 (如果用户有多张照片)。
我希望每个用户获得一行。 这可能吗?
答案 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 ) };