LINQ将删除重复的属性

LINQ将删除重复的属性,linq,Linq,我有这样一个LINQ声明: var media = (from p in postService.GetMedia(postId) select new { PostId = postId, SynthId = p.SynthId }); 返回的记录中有许多(可能有数千条)具有相同的SynthId。我想选择一个,任意一个。所以当我完成时,媒体应该包含

我有这样一个LINQ声明:

var media = (from p in postService.GetMedia(postId)
             select new
             {
                 PostId = postId,
                 SynthId = p.SynthId
             });
返回的记录中有许多(可能有数千条)具有相同的SynthId。我想选择一个,任意一个。所以当我完成时,媒体应该包含具有不同SynthId的记录

SynthId可以为null,我希望所有null都在媒体中(distinct不应该影响它们)。 如果有帮助的话,我的DAL是EntityFramework

如何以最有效的方式完成此任务?

使用分组查询:

var media =
    from p in postService.GetMedia(postId)
    group p by p.SynthId into g
    select g.First();
这将为您提供每组记录序列中的第一篇文章,其中分组键是
SynthId

如果进行投影(即使用
选择新{…}
)对您很重要,那么您应该能够使用
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 };
如果希望
SynthId
的所有
null
值都位于它们自己的组中,那么我可能会过滤第一个列表,然后进行串联,即:

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 });

这是可行的,但是分组也影响了空SynthId。有没有一种方法可以对null或任何与此相关的内容进行例外处理?@Shawn:你说“影响了null”是什么意思?预期结果与实际结果是什么?SynthId可以为null。我不想把它们分组。因此,如果有10条空的SynthId记录,那么有5条记录具有相同的SynthId。应返回11条记录。所有SynthId为null且1已分组的null记录。谢谢。在后台,这是两个独立的O(n)循环?@Shawn:postService.GetMedia只返回O(n)循环,就像
列表一样返回内存中的具体化集合。如果查询被转换到数据库,并且
SynthId
列被索引,那么它将大大快于此(仅受结果数量的限制,而不是数据库中条目的总数的限制)。