2010-05-09 58 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