2012-03-04 57 views
2

我是Raven的新手,所以我甚至不确定我是否在这里采取正确的方法。我需要生成一个项目列表,其属性是从单独的文档中提取的...本质上是一个JOIN。在RavenDB Multi Map中遇到麻烦reduce

说我有这些对象:

public class Merchant 
{ 
    public string Id {get;set;} 
    public string MerchantName {get;set;} 
} 

public class Location 
{ 
    public string Id {get;set;} 
    public string MerchantId {get;set;} 
    public string City {get;set;} 
} 

public class Item 
{ 
    public string Id {get;set;} 
    public string MerchantId {get;set;} 
    public string ItemName {get;set;} 
} 

,我需要的MapReduce(我想)到MerchantItem

public class MerchantItem 
{ 
    public string ItemId {get;set;} 
    public string MerchantId {get;set;{ 
    public string LocationId {get;set;} 
    public string ItemName {get;set;} 
    public string City {get;set;} 
    public string MerchantName {get;set;} 
} 

这里是我的(非工作)多地图缩小的列表:

AddMap<Merchant>(merchants => from m in merchants 
           select new 
           { 
           ItemId = (string)null, 
           MerchantId = m.Id, 
           LocationId = (string)null, 
           ItemName = (string)null, 
           City = (string)null, 
           MerchantName = m.Name 
           }); 

AddMap<Location>(locations => from l in locations 
           select new 
           { 
           ItemId = (string)null, 
           MerchantId = l.MerchantId, 
           LocationId = l.Id, 
           ItemName = (string)null, 
           City = l.City, 
           MerchantName = (string)null 
           }); 

AddMap<Item>(items=> from i in items 
           select new 
           { 
           ItemId = i.Id, 
           MerchantId = i.MerchantId, 
           LocationId = (string)null, 
           ItemName = i.ItemName, 
           City = (string)null, 
           MerchantName = (string)null 
           }); 

Reduce = results => from r in results 
        group result by r.LocationId 
        into g 
        select new 
        { 
        ItemId = g.Select(x => x.ItemId), 
        MerchantId = g.Select(x => x.MerchantId), 
        LocationId = g.Key, 
        ItemName = g.Select(x => x.ItemName).Where(x => x != null).FirstOrDefault(), 
        City = g.Select(x => x.City).Where(x => x != null).FirstOrDefault(), 
        MerchantName = g.Select(x => x.MerchantName).Where(x => x != null).FirstOrDefault() 
        }); 

这个想法是我需要一个MerchantItem用于数据库中的每个Item和Location。在SQL中,我们只是在谈论几个连接,但我完全难以理解如何在Raven中实现这一点。

+0

也许使用Raven的Include()功能作为不同的(更好的?)方法?我在回答这个问题时提供了一个例子:http://stackoverflow.com/questions/9500043/query-list-of-sub-documents-with-ravendb – 2012-03-05 04:38:13

+0

哈,这也是我的问题,是的类似的问题。我只是刚才看到你已经回答了。我会给你一个办法。谢谢。 – 2012-03-05 18:05:32

+0

大声笑。我也注意到了。我在那个答案中描述的是Ayende在下面说的:Include()。 – 2012-03-05 18:18:43

回答

0

瑞安,

你可以很轻松地拿到项目和相关的商家(使用Include)。但是你的索引是没有意义的。

你试图做什么?

+0

我知道如何解释它的唯一方法是通过关系术语,所以让我们试试。商家有1-n个地点和1-n个商品。在一个关系数据库中,我只需根据MerchantId将所有3个表连接在一起,并从每行中挑选出需要的字段来构建我的MerchantItem对象。但最终我需要展开三个对象来构建第4个对象,其中包含来自3个已有对象的属性。 – 2012-03-05 18:03:37