0

我正在尝试使用基于 ID(GUID)的 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结果过滤到itemID特定i( Guid) 的位置,但可以返回零个、一个或多个结果。显然,您收到的错误表明,对于您中的至少一个值,i您收到的记录不止一条。

这意味着您的数据库未正确规范化或代码中存在逻辑错误的问题。

对我来说,这听起来像是后者。

在您的代码中进一步向下,您有这个循环:

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

这对我说,您希望tempdata字典具有多个值 - 但是您正在使用itemID作为键来构建字典,并且这应该只根据您的查询在字典中放置一个值。所以你的逻辑有问题。

你能更详细地描述你想要做什么吗?


根据您在下面的评论(没有我的评论中的澄清),这似乎是您想要的:

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 回答