LINQ获得了独特的价值观

时间:2012-03-01 22:22:37

标签: sql linq linq-to-sql c#-4.0

我知道有关此主题的几个问题。然而;我找不到与我的问题直接相关的那个。

我在数据库中有3个表,而这3个表中的PK在XRef表中组成了一个复合PK。

我需要能够根据2个键选择不同的项目,以便在报告上显示。

    public IEnumerable<AssemblyPrograms> GetProgramAssemblies()
    {
        var assembliesList = (from c in eModel.Assemblies.ToList()
                             join d in eModel.Programs_X_Assemblies_X_Builds
                             on c.AssemblyID equals d.AssemblyID
                             join p in eModel.Programs
                             on d.ProgramID equals p.ProgramID
                             join a in eModel.AssemblyTypes
                             on c.AssemblyTypeID equals a.AssemblyTypeID

                             select new AssemblyPrograms
                             {
                                 AssemblyID = c.AssemblyID
                                 ,ProgramID = d.ProgramID
                                 ,AssemblyName = c.AssemblyName
                                 ,AssemblyPrefixName = c.AssemblyPrefixName
                                 ,ProgramName = p.ProgramName
                                 ,AssemblyTypeName = a.AssemblyTypeName
                                 ,AssemblyTypeID = a.AssemblyTypeID
                             });

        return assembliesList;
    }

这是我的查询以及我需要从表格中取出的内容

在我的XRef表中,我将AssemblyID,ProgramID和BuildID作为我的复合PK。

从AssemblyID到ProgramID之间可能有很多关系。 BuildID是分隔它们的关键。

我需要将Distinct AssemblyID拉到我的报告的ProgramID关系,可以忽略BuildID。

我在我的查询中尝试过.Distinct()以及其他一些无用的东西。

我很感激任何人都可以给我的帮助。

由于

1 个答案:

答案 0 :(得分:2)

接受自定义相等比较器的Distinct重载怎么样?像这样:

class AssemblyComparer : EqualityComparer<AssemblyPrograms> {
    public override bool Equals(AssemblyPrograms x, AssemblyPrograms y) {
        return x.ProgramID == y.ProgramID && x.AssemblyID == y.AssemblyID;
    }

    public override int GetHashCode(AssemblyPrograms obj) {
        return obj.ProgramID.GetHashCode() ^ obj.AssemblyID.GetHashCode();
    }
}