RavenDB - 包含对象的条件

时间:2012-03-06 10:07:08

标签: 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
}

我的问题是,是否有可能添加查询类似.Where(o2 =&gt; o2.Obj1Id ==“some / Id”)?查询在客户端(Linq)方面对Obj2一无所知,但服务器端使用它们,因为这只向DB发出一个请求。

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

我的另一个解决方案是将Obj1Id添加到Obj3,但这会产生重复(我可以忍受这个;)

对象的一些额外信息:
- Obj1对每个客户都是唯一的,因此大约有200个文件 - Obj2:Obj3是1:1的兄弟姐妹,每个兄弟都有自己的观点属性,每个顾客约为100.000

奖金问题:是否有类似Inclide链接的内容?包括Obj1在内的包含Obj2? (这个我不会用,只是问题)

2 个答案:

答案 0 :(得分:1)

不,你不能在include中添加条件。 它要么全部进入,要么根本没有。

答案 1 :(得分:0)

正如奥伦所说,你有条件。因此,如果Obj2和Obj3都有一些共同的东西,比如Obj1的Id,你可以重构你的数据,或者使用多地图(也许还可以减少)索引。

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