2013-08-19 28 views
3

我收到了來自Raven DB的奇怪(非)結果。Raven DB LINQ Where->任何查詢不起作用

我正在客戶端和服務器上運行最新的穩定版本v2.5.2666。

我想要檢索的是「第一個包含Id值爲'x'的Component對象的DeployProject文檔」。

所以,我想的第一件事就是:

var project = _documentSession.Query<DeployProject>() 
     .FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId)); 

但是返回null,即使我知道的數據是正確的。爲了驗證我不瘋狂,我添加了一個.ToList()到中間,所以它會把所有的文檔都放到內存中查詢它。

var project = _documentSession.Query<DeployProject>() 
     .ToList() 
     .FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId)); 

而且DID工作,所以我的邏輯和數據是正確的。但是,這當然是非常低效的,整個想法是我只想拉取包含相關子記錄的單個文檔。

所以有一定似乎與掠奪是如何查詢索引,因爲數據肯定是有問題的,我可以檢索它,如果我拉的一切到內存並運行相同的LINQ查詢。

我希望(?恐懼)是該指數爲陳舊的,所以我告訴它給我新的數據:

var project = _documentSession.Query<DeployProject>() 
     .Customize(i=>i.WaitForNonStaleResultsAsOfLastWrite()) 
     .FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId)); 

但同樣我得到空。 Raven似乎並不像我期望的那樣對待LINQ語句,即LINQ到對象的方式將起作用。我知道有一些canbe差異,但是這應該是我希望的工作一個非常簡單的查詢。

任何人有任何想法?我錯過了一些簡單的東西嗎

編輯:據Raven的文件,好像這應該沒有任何冒險索引工作:

http://ravendb.net/docs/client-api/querying/using-linq-to-query-ravendb

除了WHERE子句中,還有其他一些有用的運營商 你可以用它來過濾結果。

任何可以對物體(或元列表)的集合在 實體使用,只有那些誰滿足條件返回。 RavenDB也 支持一個在運營商,使扭轉任何比較簡單:

// Return only companies having at least one employee named "Ayende" 
IQueryable<Company> companies = from c in session.Query<Company>() 
           where c.Employees.Any(employee => employee.Name == "Ayende") 
           select c; 
+1

Downvote?真?任何原因? –

+1

對我來說,倒票是一個不明白問題的人。 – Hogan

回答

0

我認爲這可能是一個類型的問題,這是醜陋的,但你試過嗎?

var project = _documentSession.Query<DeployProject>() 
    .Where(i=>i.ComponentList.Any(j=>j.Id.ToString() == componentId.ToString())) 
    .FirstOrDefault(); 

如果這樣工作,那麼原始查詢將比較兩種不同類型,而不是正確轉換其中一種。


試試這個,看看它是否給你你所期望的...

var project = _documentSession.Query<DeployProject>() 
     .Where(i=>i.ComponentList.Any(j=>j.Id == componentId)) 
     .FirstOrDefault(); 

我知道這應該是相同的,但你可以使用調試器測試它像這樣,看看返回什麼:

var project = _documentSession.Query<DeployProject>() 
     .Where(i=>i.ComponentList.Any(j=>j.Id == componentId)) 
     .ToList() 
     .FirstOrDefault(); 
+0

同樣的結果,我忽略提到,在我原來的問題(試圖簡潔),但是我試着改變一切。而不是.FirstOrDefault,它仍然沒有找到任何匹配的記錄(除非我當然移動。 ToList()在.Where或.FirstOrDefault之前,這種情況我正在尋找內存而不是Raven) –

0

首先,子查詢是不是真的簡單在所有 - 從raven/LINQ的角度來看,這是一個非常複雜的查詢。我會看看這個創建的特定索引,看看它是否真的有效。

這裏更好的方法是建立一個索引。引發我的兩種方法是在列出的部署項目中構建一個按componentId分組的索引。另一種方法是創建一個包含componentId的全文樣式索引,然後您可以非常有效地搭載lucene的導軌。

+0

呃,我很害怕這樣的事情。 Raven很贊,直到這樣的點,直到答案開始「手動創建一個lucene索引來映射減少哦,我的上帝爲什麼這麼難轉換我只是想找到包含某個記錄的文檔」:) –

+0

另一個問題是Raven的文檔說你應該可以這樣做:http://ravendb.net/docs/client-api/querying/using-linq-to-query-ravendb。 –

+0

@MikeMooney - 公平點雖然你有相同的心算與SQL,我們只是習慣了它是內化在這一點:)。此外,文檔並不意味着首先或默認的行爲 - 只要你可以得到where子句。先不檢查或默認檢查並查看出現的內容,然後查看ravendb創建的索引。我也會迴歸測試一個版本,看看是否有幫助 - 可能是你發現的一個新的2.5錯誤。 –