根据另一个问题,我的问题进一步扩展了。我有以下对象形状...(我正在使用RavenDB,这就是为什么我有'字符串'的身份)
这并不像我说的那么复杂,但很难简洁地沟通,所以请耐心等待。如果这没有意义,我会尝试修改它。
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>>
。这只是获得的Id
和Name
目标列表。 (这只是一个简单的例子,为了解决这个问题。我知道它并不完全是一个实用的形状)
那么,正如我的另一个问题所述(在这里可见:Select All that do not already exist in destination)我希望得到满足的“目标”而不会在每次运行时都获得重复。这是通过一个简单的查询来解决的。
Orders.Where(o => o.Requirement.Value > requirment).Except(processedOrders);
如果目标数组和源数组相同,但是我的“目标”是List<Reference<Order>>
,而我的源是List<Goal>
,则该方法有效。该阵列可以解决一个问题......
假设User
有一个带有两个数组的对象Notebook
。 List<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只是一个非规范化的引用列表,如果没有大量的重新组装,就无法将其转换回原始对象。有没有办法让这种比较更顺畅?
答案 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);