在我的架构中,我有两个数据库表。关系和关系_会员。我试图从关系表中检索其中包含特定成员的所有条目,因此必须将其与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 (用于单元测试)。
将下面的答案标记为答案,因为我喜欢他更好地加入它的方式。
答案 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>();
}
让我知道如果我离开这个,我可以再次尝试。