在实体框架中有所区别

时间:2011-12-16 15:13:26

标签: c# .net linq entity-framework distinct

我有一个对象列表,其中一些具有相同的ID,所以我想删除那些重复的元素。

我试过这样的事情:

List<post> posts = postsFromDatabase.Distinct().ToList();

但它不起作用!

所以我写了这个方法以避免重复:

public List<Post> PostWithOutDuplicates(List<Post> posts)
    {
        List<Post> postWithOutInclude = new List<Post>();
        var noDupes = posts.Select(x => x.Id).Distinct();
        if (noDupes.Count() < posts.Count)
        {
            foreach (int idPost in noDupes)
            {
                postWithOutInclude.Add(posts.Where(x => x.Id == idPost).First());
            }
            return postWithOutInclude;
        }
        else
        {
            return posts;
        }
    }

关于如何提高性能的任何想法??

提前完成。

3 个答案:

答案 0 :(得分:26)

这很简单:

List<Post> posts = posts
.GroupBy(x => x.Id)
.Select(x => x.FirstOrDefault())

但是如果你想以正确的方式写它,我建议你这样写:

public class PostComparer : IEqualityComparer<Post>
{
    #region IEqualityComparer<Post> Members

    public bool Equals(Post x, Post y)
    {
        return x.Id.Equals(y.Id);
    }

    public int GetHashCode(Post obj)
    {
        return obj.Id.GetHashCode();
    }

    #endregion
}

在进行额外比较时,它将为您提供更多自由。写完这门课后,你可以像这样使用它:

List<Post> posts = postsFromDatabase.Distinct(new PostComparer()).ToList();

答案 1 :(得分:5)

我认为编写自己的自定义比较器是一种很好的方法。

msdn中的一篇文章很好地解释了这个主题:http://support.microsoft.com/kb/320727

Distinct没有工作的原因Distinct()不知道如果有等于detemine,所以它使用引用来确定它是相同的“对象”。它的工作方式就像工作一样。查询中的所有类都不是同一个对象。

通过编写自己的比较器(很容易),您可以告诉Distinct()如何进行比较以确定它们是否相等。

编辑:如果不使用Distinct不是问题而且情况不是frecuent,那么Piotr Justyna的第一个答案就是简单而有效。

答案 2 :(得分:1)

而不是.First(),请尝试.FirstOrDefault()

相关问题