2010-04-06 60 views
1

我有一个LINQ声明是这样的:LINQ去除重复的属性

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

有很多(可能是成千上万)的记录与同SynthId返回。我想选择一个,任意一个。所以当我完成后,媒体应该包含独特SynthId的记录。

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

如何以最有效的方式完成此操作?

回答

2

使用分组查询:

var media = 
    from p in postService.GetMedia(postId) 
    group p by p.SynthId into g 
    select g.First(); 

这会给你的序列中的第一篇文章对各组的记录,其中分组关键是SynthId

如果你做的投影是很重要的(即使用select new { ... }),那么你应该能够使用let关键字:如果你希望所有nullSynthId,在他们

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

自己组,那么我可能会筛选第一个列表,然后做一个串联,即:

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

这工作,但分组也影响了空SynthId。有没有办法对null或任何内容进行例外处理? – 2010-04-06 00:48:46

+0

@Shawn:你是什么意思呢“影响了null?”预期与实际结果是什么? – Aaronaught 2010-04-06 00:50:20

+0

SynthId可以为null。我不希望那些被分组。所以如果有10个空SynthId记录,5个记录具有相同的SynthId。应该有11条记录返回。所有具有null SynthId和1分组的空记录。 – 2010-04-06 00:53:13