LINQ将删除重复的属性
我有这样一个LINQ声明:LINQ将删除重复的属性,linq,Linq,我有这样一个LINQ声明: var media = (from p in postService.GetMedia(postId) select new { PostId = postId, SynthId = p.SynthId }); 返回的记录中有许多(可能有数千条)具有相同的SynthId。我想选择一个,任意一个。所以当我完成时,媒体应该包含
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
列被索引,那么它将大大快于此(仅受结果数量的限制,而不是数据库中条目的总数的限制)。