Linq加入时返回了太多结果

时间:2010-05-09 23:48:06

标签: c# linq linq-to-sql

在我的架构中,我有两个数据库表。关系和关系_会员。我试图从关系表中检索其中包含特定成员的所有条目,因此必须将其与relationship_memberships表连接。我的业务对象中有以下方法:

    public IList<DBMappings.relationships> GetRelationshipsByObjectId(int objId)
    {
        var results = from r in _context.Repository<DBMappings.relationships>()
                      join m in _context.Repository<DBMappings.relationship_memberships>()
                        on r.rel_id equals m.rel_id
                      where m.obj_id == objId
                      select r;
        return results.ToList<DBMappings.relationships>();
    }

_Context是我的通用存储库,使用基于概述here的代码的代码。

问题是我在关系表中有3条记录,在成员资格表中有3条记录,每条成员都绑定了不同的关系。 2个成员资格记录的obj_id值为2,另一个为3.我试图检索与对象#2相关的所有关系的列表。

当此linq运行时,_context.Repository<DBMappings.relationships>()返回正确的3条记录,_context.Repository<DBMappings.relationship_memberships>()返回3条记录。但是,当results.ToList()执行时,结果列表有两个问题:

1)结果列表包含6条记录,全部类型为DBMappings.relationships()。经过进一步检查,每个真实关系记录有2个,两者都是彼此的精确副本。

2)返回所有关系,即使m.obj_id == 3,即使objId变量正确传入2,也是如此。

任何人都可以看到发生了什么,因为我花了2天时间查看这段代码,我无法理解错误。我加入其他似乎工作得很好的linq查询,我的单元测试显示它们仍在工作,所以我必须做错了。看起来我需要额外的一双眼睛:)

编辑:好的,好像整个问题都是我设计单元测试的方式,因为单元测试实际上没有为记录分配ID值,因为它没有打到sql (用于单元测试)。

将下面的答案标记为答案,因为我喜欢他更好地加入它的方式。

3 个答案:

答案 0 :(得分:3)

试试这个

public IList<DBMappings.relationships> GetRelationshipsByObjectId(int objId) 
{ 
    var results = (from m in _context.Repository<DBMappings.relationship_memberships>() 
                  where m.rel_id==objID
                  select m.relationships).ToList();
    return results.ToList<DBMappings.relationships>(); 
} 

答案 1 :(得分:2)

如何设置_context.Log = Console.Out只是为了查看生成的SQL查询?与我们共享输出(可能使用一些streamwriter而不是console.out,以便您可以轻松地复制它而不会出错)。

Pz,TaskConnect开发人员

答案 2 :(得分:2)

我可能会倒退,但我认为你不需要加入。如果您正确设置了外键,这应该可行,对吧?

public IList<DBMappings.relationships> GetRelationshipsByObjectId(int objId)
{
    var mems = _context.Repository<DBMappings.relationship_memberships>();
    var results = mems.Where(m => m.obj_id == objId).Select(m => m.relationships);
    return results.ToList<DBMappings.relationships>();
}

这是另一种选择(如果我颠倒了我脑中的映射):

public IList<DBMappings.relationships> GetRelationshipsByObjectId(int objId)
{
    var mems = _context.Repository<DBMappings.relationship_memberships>();
    var results = mems.Where(m => m.obj_id == objId).SelectMany(m => m.relationships);
    return results.ToList<DBMappings.relationships>();
}

让我知道如果我离开这个,我可以再次尝试。