2017-02-09 9 views
1

私にはわかりません。あなたが見ることができるように、ルール1のために、私はSiteOneとSiteTwoの両方を持っている辞書の問題:results.Read <NotificationRule>()。ToDictionary(ルール=> rule.Id)重複キーの状態

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

次のセットを返します

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) 
) 

私はこのコードのビットを持っています。これは許可されなければならない。

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>} 

、この構築物中で、私は2つのキーを持っていませんすべてが同じ要素に終わるからです。

+1

「辞書」の中でキーは一意でなければならない - あなたの例では「1」が3倍で表示されます – 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

辞書を作成するのではなく、グループを作成したいと思うかもしれません。 rule.Id

またはあなたがちょうどあなたがいる限り、コレクションresults内のオブジェクトが持っていないよう var siteId = 1; var sites = results.Read<NotificationRule>().Where(r => r.Id == siteId);

+0

私はグループが私が探していたものだと思う、ありがとう!私は複数の関係を取得しようとしている、私は恐れている。それは私がすべてのルールを列挙するビューのためです。ルールが2つのサイトに適用される場合は、そのように表示する必要があります。 2つのサイトに適用します。私は特定のサイトのものを取得するための別の実装があります。 :)私は今 "GroupBy"をテストしています。 :) –

+0

以前の条件付きクエリで問題が実際上より高かったとわかりました。私は実際に重複した行を取得していました。ありがとうございました! –

1

を行うことができ、特定のルールのための部位を取得しようとしている場合によって

var rules = results.Read<NotificationRule>().GroupBy(k => rule.Id); この意志グループのルールフィールド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]を持っていないので、もう...しかし、私はまだキーがあなたの答えにあると思います。 。:) –

+0

@OlgaAkselradは 'group => group.ToArray()'を 'group => group.ToList()'に置き換えます。 –

関連する問題