代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

要删除重复属性的Linq

  •  1
  • Shawn Mclean  · 技术社区  · 16 年前

    我有一个这样的LINQ声明:

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

    同一个synthid返回了许多(可能有数千个)记录。我想选择一个,任意一个。所以当我完成后,媒体应该包含具有独特synthid的记录。

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

    我如何以最有效的方式完成这项工作?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Aaronaught    16 年前

    使用分组查询:

    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 值为 合成物 在他们 拥有 分组,然后我可能过滤第一个列表,然后进行串联,即:

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