2017-02-09 44 views
1

我有一個輕微的問題,我似乎不明白。字典問題:results.Read <NotificationRule>()。ToDictionary(rule => rule.Id)表示複製密鑰

我有這段代碼:

SELECT sr.RuleId, s.Id, s.Name FROM Sites s 
INNER JOIN NotificationSiteRules sr ON s.Id = sr.SiteID 
WHERE sr.RuleId IN (
    SELECT r.Id FROM NotificationRules r 
    INNER JOIN NotificationSiteRules sr ON r.Id = sr.RuleId 
    WHERE r.IsDeleted = 0 AND (@siteId IS NULL OR sr.SiteId = @siteId) 
) 

返回下面的一組:

1 1 SiteOne 
3 1 SiteOne 
7 1 SiteOne 
1 5 SiteTwo 

正如你所看到的,對於規則1我都SiteOne和SiteTwo。這必須被允許。

NotificationRule對象的定義是:

public class NotificationRule 
{ 
    public NotificationRule() 
    { 
     Sites = new List<Site>(); 
     Recipients = new List<Recipient>(); 
    } 

    public int? Id { get; set; } 
    public string Name { get; set; } 

    public List<Site> Sites { get; set; } 
    public List<Recipient> Recipients { get; set; } 

} 

因此,在這個定義中,它實際上是說,通過每個ID我應該能有一個列表網站的 ...但我越來越

System.ArgumentException: An item with the same key has already been added. 

當我做

var rules = results.Read<NotificationRule>().ToDictionary(rule => rule.Id); 

什我做錯了嗎?

對不起,我在編輯這個問題,因爲我擔心我不清楚自己想要達到的目標。

最後的結果,我希望是這樣的形式:

{1, [1,5],[SiteOne, SiteTwo]} 

這將符合:

{Key, List<Recipient>, list<Site>} 

正如你所看到的,在這個結構我不會有兩個鍵,因爲所有結果都是相同的元素。

+1

「Dictionary」中的鍵必須是唯一的 - 「1」在您的示例中顯示爲3x – fubo

+1

您可以使用字典的組合鍵使其唯一。也許是RuleID和Id的元組? – itsme86

+0

是的!如果你[按照文檔](https://msdn.microsoft.com/en-us/library/xfhwa508(v = vs.110).aspx#Anchor_8),你會發現'Dictionary'不能有重複如果發生這種情況,將會拋出一個'ArgumentException'。 –

回答

0

其實我只是發現問題不在於那一小段代碼;那個被處理好了。問題是@siteId到達null,然後我在之前的查詢中得到重複項。 我現在正在討論這個問題,因爲這個問題現在沒有意義;我需要找出一種方法來修復以前的查詢,以獲得正確的值......或處理該空值的方法。 謝謝大家的幫助!

1

這聽起來像你可能想要做一個小組而不是創建一本字典。

var rules = results.Read<NotificationRule>().GroupBy(k => rule.Id); 這將組通過rule.Id

的規則,或者如果你只是試圖讓網站爲特定的規則,你可以做 var siteId = 1; var sites = results.Read<NotificationRule>().Where(r => r.Id == siteId);

+0

我認爲這個小組就是我一直在尋找的,謝謝!我試圖找回多重關係,恐怕。這是爲了列舉所有規則的觀點。如果該規則適用於兩個網站,則應該如此顯示;適用於兩個網站。我有另一個實現獲取特定網站的。 :)我正在測試「GroupBy」。 :) –

+0

我發現在以前的條件查詢中問題實際上更高。我實際上正在獲取重複的行。謝謝! –

1

只要收集results中的對象都沒有字段Id中的唯一值必須在將結果放到字典中之前進行分組。

results.Read<NotificationRule>() 
    .GroupBy(rule=>rule.Id).ToDictionary(group => group.Key, group=>group.ToArray()); 
+0

恐怕沒有按我所希望的那樣工作,因爲我不能像'results.Read ((ruleId,s)=> {rule [ruleId] .Sites.Add(s) ;}',因爲在創建帶有該組的字典之後,我沒有構造規則[ruleId] .Sites了......但我仍然認爲關鍵在於你的回答,所以我一直在使用它。:) –

+0

@OlgaAkselrad替換group => group.ToArray()'到'group => group.ToList()' –

相關問題