0

GUID である ID に基づいて linq を使用してコレクションを作成しようとしています。辞書を使用すると、「同じキーを持つ項目が既に追加されています」というエラーが表示されます。

        foreach (Guid i in ar) 
                          { 


               var prod = (from r in datacontext.item_tables's where r.itemID == i select r); 
        Dictionary<Guid, item_tables> tempdata =prod.ToDictionary(s => s.itemID); 
         Facet[] ftemp = new Facet[tempdata.Count]; 
               string s1 = ""; 

               ftemp[0] = new Facet("descriptiob", FacetType.Text, tempdata[i].Description); 

               ftemp[1] = new Facet("date", FacetType.Text, tempdata[i].uploaddate); 


               for (int iv = 0; iv < tempdata.Count; iv++) 
               { 


                   s1 += tempdata[i].ProductName + " \n";  
               } 

               ftemp[2] = new Facet("ProductName", FacetType.Text, s1); 


           }
4

1 に答える 1

0

基本的に、次のコードを使用して辞書を作成しています。

datacontext
    .item_tables
    .Where(r => r.itemID == i)
    .ToDictionary(s => s.itemID);

は一度に特定の( )Whereに結果をフィルタリングしますが、ゼロ、1 つ、または複数の結果を返すことができます。明らかに、あなたが得ているエラーは、少なくとも 1 つの値に対して複数のレコードが返されていることを示しています。itemIDiGuidi

これは、データベースが適切に正規化されていないか、コードに論理エラーがあるという問題を意味します。

私には後者のように聞こえます。

コードのさらに下には、次のループがあります。

    for (int iv = 0; iv < tempdata.Count; iv++) 
    { 
        s1 += tempdata[i].ProductName + " \n";  
    }

tempdataこれは、ディクショナリに複数の値があることを期待していることを示していますがitemID、キーとして使用してディクショナリを作成しているため、クエリに基づいてディクショナリに値を 1 つだけ配置する必要があります。したがって、ここでロジックに何か問題があります。

あなたがしようとしていることをより詳細に説明できますか?


以下のコメントに基づいて(私のコメントからの説明なしで)、これはあなたが望むもののようです:

var query =
    from r in datacontext.item_tables
    group r.ProductName by new
    {
        r.itemID,
        r.Description,
        r.uploaddate,
        r.ItemName,
    };

foreach (var items in query.ToArray())
{
    var f0 = new Facet("descriptiob", FacetType.Text, items.Key.Description);
    var f1 = new Facet("date", FacetType.Text, items.Key.uploaddate);
    var f2 = new Facet("ProductName", FacetType.Text, String.Join("\n", items));
    collection.AddItem(items.Key.ItemName, null, null, f0, f1, f2); 
}
于 2012-05-21T01:30:06.920 に答える