LINQ删除重复的属性

时间:2010-04-06 00:39:43

标签: linq

我有这样的LINQ语句:

var media = (from p in postService.GetMedia(postId)
             select new
             {
                 PostId = postId,
                 SynthId = p.SynthId
             });

使用相同的SynthId返回的记录很多(可能是数千个)。我想选择一个,任意一个。所以当我完成时,媒体应该包含具有不同SynthId的记录。

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

如何以最有效的方式实现这一目标?

1 个答案:

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