2012-03-06 78 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這樣的抽象名稱來發布另一個更具體的問題)。