LINQ:选择匹配单个字段的所有内容,合并原始字段

时间:2011-12-28 17:45:39

标签: c# linq

根据另一个问题,我的问题进一步扩展了。我有以下对象形状...(我正在使用RavenDB,这就是为什么我有'字符串'的身份)

这并不像我说的那么复杂,但很难简洁地沟通,所以请耐心等待。如果这没有意义,我会尝试修改它。

TLDR

Collection A包含我想要的内容,而不会让Collection B中的项目具有匹配的ID。这两个集合不包含相同的数据类型。

进一步详情

class Entity { 
  string Id { get; set; }
}
interface IName {
  string Name { get; set; }
}

class Reference<T> where T : Entity, IName {
  public string Id { get; set; }
        public string Name { get; set; }

        public static implicit operator Reference<T>(T doc) {
            return new Reference<T> {
                Id = doc.Id,
                Name = doc.Name
            };
        }
}

那么,如果我有一个具有..的对象

List<Reference<Product>>我可以直接分配产品,它只会存储ID /名称。这是我的目标。然而,当涉及列表比较时,这变得棘手。

那么,假设我有一个像这样的数组..

[
 { 
   "Id" : 1, 
   "Requirement" : { 
     "Value" : "2", "Name" : "Orders" 
    }
 },
 { 
   "Id" : 2, 
   "Requirement" : { 
     "Value" : "4", "Name" : "Orders" 
    }
 },
 { 
   "Id" : 3, 
   "Requirement" : { 
     "Value" : "6", "Name" : "Orders" 
    }
 },
 { 
   "Id" : 4, 
   "Requirement" : { 
     "Value" : "8", "Name" : "Orders" 
    }
 },
]

这是Goals。然后假设一个数组List<Reference<Goal>>。这只是获得的IdName目标列表。 (这只是一个简单的例子,为了解决这个问题。我知道它并不完全是一个实用的形状)

那么,正如我的另一个问题所述(在这里可见:Select All that do not already exist in destination)我希望得到满足的“目标”而不会在每次运行时都获得重复。这是通过一个简单的查询来解决的。

Orders.Where(o => o.Requirement.Value > requirment).Except(processedOrders);

如果目标数组和源数组相同,但是我的“目标”是List<Reference<Order>>,而我的源是List<Goal>,则该方法有效。该阵列可以解决一个问题......

假设User有一个带有两个数组的对象NotebookList<Reference<Goal>> GoalsReached List<OrdersPlaced>。其中OrdersPlaced看起来像这样......

class OrdersPlaced {
  string ProductId { get; set; }
  int Quantity { get; set; }
}

var filtered = goals.Where(n => n.Requirements.Any(r => r.Name == order.Name))
                            .Where(m => m.Requirements.Any(p => p.Total <= order.Total))
                            .Select(n => n.Id)
                            .Except(user.Notebook.GoalsReached);

这就是问题的开始。 GoalsReached只是一个非规范化的引用列表,如果没有大量的重新组装,就无法将其转换回原始对象。有没有办法让这种比较更顺畅?

1 个答案:

答案 0 :(得分:1)

而不是使用except,这需要具有相同类型的数据进行比较。您应该按照以下方式执行此操作

var filtered = goals.Where(n => n.Requirements
                                 .Any(r => r.Name == order.Name))
                                 .Where(m => m.Requirements.Any(p => p.Total <= order.Total) 
                                             && !user.Notebook.GoalsReaches.Any(g => g.ID == n.Id))
                                 .Select(n => n.Id);