2016-06-14 88 views
0

这里的设置,我有包含像这样的事件列表的对象:如何在嵌套对象的查询类型在RavenDB

public class Order 
{ 
    public string Name {get; set;} 
    public List<OrderEvent> OrderEvents {get; set;} 
    public bool IsComplete() => OrderEvents.Any(e => e.GetType() == typeof(OrderComplete)); 
} 

public class OrderEvent 
{ 
    public DateTime TimeStamp {get; set;} 
} 

public class OrderSubmitted : OrderEvent {...quantity ect...} 
public class OrderPaidFor : OrderEvent {...amounts...} 
public class OrderComplete : OrderEvent {...more stuff...} 

现在我可以转储这个数据到数据库并把它拉出来,一切都很好,但是我怎么写一个查询来获得完成的订单,而不需要拉取客户端的所有订单并在那里过滤?

我试过以下查询,但我被告知我无法像那样转换GetType。

Session.Query<Order>() 
     .Where(o => o.Events.Any(e => e.GetType() == typeof(OrderComplete))) 
     .ToList(); 

我敢肯定有做的一个很好的方式使用这个和JObjects查询$ type属性,但谷歌和我的努力没有想出什么好东西呢。

谢谢。

回答

1

您可以做的是使IsComplete()函数成为只读属性。这样它将在存储的文档中序列化为IsComplete: true/false

那么你应该能够查询是这样的:

Session.Query<Order>() 
    .Where(o => o.IsComplete) 
    .ToList(); 

希望这有助于!

+1

这并不是我期望的答案,但是它让代码更易于阅读和使用。有时候,简单的答案是最好的答案。谢谢! – Yojin