Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq连接-重复_C#_.net_Asp.net_Sql - Fatal编程技术网

C# Linq连接-重复

C# Linq连接-重复,c#,.net,asp.net,sql,C#,.net,Asp.net,Sql,我有两张桌子 1.用户表(用户名、名称) 2.图片表(ID、用户名、iPrimary) 每个用户可以有零到多张图片。 我正在尝试编写一个查询,该查询将返回所有用户(有或没有图片)和一个图片Id(对于IsPrimary=true的图片) 我写了这个Linq查询: var v = from u in Users join p in Photos on u.Username equals p.Username select new { u.Username,

我有两张桌子

1.用户表(用户名、名称)

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

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

我正在尝试编写一个查询,该查询将返回所有用户(有或没有图片)和一个图片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
          };
这可以工作,但会返回重复的用户行。(如果用户有多张照片)

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

这应该正是你想要的

from u in Users
let p = Photos.Where(p => p.Username == u.Username).FirstOrDefault()
where p <> null
select new
{
    u.Username,
    p.ID
};
来自用户中的u
设p=Photos.Where(p=>p.Username==u.Username).FirstOrDefault()
其中p为null
选择新的
{
u、 用户名,
p、 身份证
};

但是,值得注意的是,编写手动优化SQL并使用db.ExecuteQuery或类似工具检索对象可能会更好。

您可以使用分组:

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

代替First(),您可以执行其他一些筛选…

您应该将IsPrimary置于where条件下。另外,由于用户可以没有图片,所以需要左连接

编辑:exmaple如下(可能有打字错误)

编辑:顺便说一下,John Gietzen的答案似乎没有给出您所问的答案。

var upic=来自用户中的u 在u上的图片中加入p。用户名等于p。用户名变成g 从g.DefaultIfEmpty()中的o开始 其中o==null | | o.IsPrimary==true 选择新的{UserName=u.UserName,Id=(o==null?”(无图片)”:o.Id)};

这应该与我的加入代码一起使用还是作为一个单独的代码?你能写完整的代码plz吗?你的加入代码是无用的,因为你只是从用户表中获取用户名,图片表中已经有了这个用户名。利用这样的情况,我明白了。但是这个查询不允许我选择certian用户。我想首先根据几个参数选择用户(比如Username>1000),然后为每个用户获取一张照片。你能给我举个例子吗?不,不是真的。它应该做得很好;但是,它似乎有点不可靠。
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
}
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 ) };