2010-05-09 64 views
3

在我的模式中,我有两个数据库表。关系和relationship_memberships。我试图从关系表中检索所有具有特定成员的条目,因此必须将其与relationship_memberships表一起加入。我在我的业务对象下面的方法:Linq在加入时返回的结果太多

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

似乎能够加入所有的R到所有的m,使得9条记录,然后过滤下降到6条,其中m.obj_id == OBJID,所以它的上子句ISN我认为,没有工作。我们可以得到对象的定义吗?它可能有助于 – pdr 2010-05-10 00:08:09

+0

关系对象只是由dbml生成的sql类的linq。关系表截至目前只有一个ID号和一个名称标签。 – KallDrexx 2010-05-10 12:06:50

回答

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>(); 
} 
+0

不知道我没有加入就可以做到这一点。当我回家的时候我会尝试的! – KallDrexx 2010-05-10 12:17:00

+0

顺便说一句 - Pramodh的和我的一样;它使用漂亮的Linq语法,并使用oldschool,丑陋的常规C#语法。但是,唉,它比我的版本更容易阅读,尽管我更喜欢所有形式的丑陋,我想...... – 2010-05-10 20:27:08

2

如何设置_context.Log = Console.Out只是为了查看生成的SQL查询?与我们分享输出(也许使用一些streamwriter而不是console.out,以便您可以轻松复制并且没有错误)。

的Pz,该TaskConnect开发商

+0

啊,我一直在想如何看到生成的查询。我会试试这个。 – KallDrexx 2010-05-10 12:10:28

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>(); 
} 

让我知道如果我用这种方式了,我可以在它采取另一种刺。

+0

当我回家时我会试试这个。我没有意识到我可以做到这一点! – KallDrexx 2010-05-10 12:09:49