2012-03-06 90 views
2

条件让有theese对象:RavenDB - 其中包括对象

public class Obj1 
{ 
    public string Id { get; set; } 
} 

public class Obj2 
{ 
    public string Id { get; set; } 
    public string Obj1Id { get; set; } 
} 

public class Obj3 
{ 
    public string Id { get; set; } 
    public string Obj2Id { get; set; } 
} 

我使用包括这样的:

var objs3 = session.Query<Obj3>() 
    .Customize(x => x.Include<Obj3>(o3 => o3.Obj2Id)) 
    .Take(1000) 
    .ToList(); 
foreach (var obj3 in objs3) 
{ 
    var obj2 = session.Load<Obj2>(obj3.Obj2Id); 
    //do something with it 
} 

我的问题是,是否有可能加入到查询类似。凡(o2 => o2.Obj1Id ==“some/Id”)?查询在客户端(Linq)方面对Obj2一无所知,但服务器端与它们协同工作,因为这只对数据库发出一个请求。

我试图看看如何工作索引和预测,但没有运气的一些结构。也许我的观点是从关系数据库变形,还有其他解决方案,需要我的结构重新定义...

我的其他解决方案是Obj1Id添加到Obj3,但这将使复制品(我可以忍受这一点; ))

一些额外的信息对象:
- OBJ1是为每个客户独特的,所以有大约200个文件
- OBJ 2:OBJ 3是1:1点的兄弟姐妹,每个都有自己的角度视图属性,既约100.000每个客户

奖金问题:有没有像内部链接?在Obj2中包含Obj1? (这个我不会用,只是问题)

回答

1

不,你不能添加条件到include。它要么全部进入,要么完全不存在。

+0

所以是我的解决方案与重复Obj1Id正确和干净? – sasjaq 2012-03-06 10:19:13

0

正如Oren所说,你在条件允许范围内。所以你可以重构你的数据,或者如果Obj2和Obj3有共同的东西,比如Obj1的Id,那么你可以使用多重映射(也可能是减少)索引。

你的情况哪种方式更好取决于你所拥有的数据的种类,这里没有一般的答案。 (也许你可以用实际的类名称而不是像Obj1-3这样的抽象名称来发布另一个更具体的问题)。