我有这样的LINQ语句:
var media = (from p in postService.GetMedia(postId)
select new
{
PostId = postId,
SynthId = p.SynthId
});
使用相同的SynthId返回的记录很多(可能是数千个)。我想选择一个,任意一个。所以当我完成时,媒体应该包含具有不同SynthId的记录。
SynthId可以为null,我希望所有空值都在媒体中(不同的不应该影响它们)。 我的DAL是EntityFramework,如果这会有所帮助。
如何以最有效的方式实现这一目标?
答案 0 :(得分:2)
使用分组查询:
var media =
from p in postService.GetMedia(postId)
group p by p.SynthId into g
select g.First();
这将为您提供每组记录序列中的第一篇文章,其中分组键为SynthId
。
如果对您进行投影很重要(即使用select new { ... }
),那么您应该可以使用let
关键字:
var media =
from p in postService.GetMedia(postId)
group p by p.SynthId into g
let firstPost = g.First()
select new { PostId = firstPost.PostId, SynthId = firstPost.SynthId };
如果您希望null
的所有SynthId
值都在其拥有组中,那么我可能会过滤第一个列表,然后进行连接,即:< / p>
var media = postService.GetMedia(postId);
var myMedia =
(from p in media
where p.SynthId != null
group p by p.SynthId into g
let firstPost = g.First()
select new { PostId = firstPost.PostId, SynthId = firstPost.SynthId })
.Concat
(from p in media
where p.SynthId == null
select new { PostId = firstPost.PostId, SynthId = firstPost.SynthId });