2012-11-22 20 views
3

我剛剛開始使用RavenDB並遇到了一個奇怪的場景。具有不同LINQ語法的Raven Db似乎無法正常工作

當我運行下面的查詢時,模型被填充得很好。一切都很好。

var contacts = Session.Query<Contact>() 
         .Where(c => c.UserId == this.userId) 
         .ToList(); 

var model = contacts.Select(c => new SelectListItem() { 
            Text = c.FullName, 
            Value = c.Id }).ToList(); 

但是,這不是我開始的代碼。我從下面的代碼開始,填充聯繫人FullName的Text屬性。由於某些隨機原因,它不會從聯繫人ID填充Value屬性。

var model = (from c in Session.Query<Contact>() 
       where c.UserId == this.userId 
       select new SelectListItem() { 
         Text = c.FullName, 
         Value = c.Id }).ToList(); 

我不知道這是否是一個錯誤,或者如果我只是簡單的東西。想法?

**更新**

它也不喜歡這種語法。我必須在這裏錯過一些非常基本的東西。

var model = Session.Query<Contact>() 
        .Where(c => c.UserId == this.userId) 
        .Select(c => new SelectListItem() { Text = c.FullName, Value = c.Id }) 
        .ToList(); 

回答

2

不同的是,在第一種情況下,你已經投影之前有一個ToList()電話。所以LINQ提供商唯一需要擔心的是撥打Where。它將爲每個Contact獲取全部的數據,然後將投影發生在LINQ to Objects中。

在你的第二個代碼中,Select調用也需要LINQ提供程序處理 - 並且可能它沒有做正確的事情。

所以是的,這聽起來像一個在RavenDB LINQ提供程序中的錯誤,在Select處理。

注意,迫使其餘查詢在LINQ執行到對象的另一種方法是使用AsEnumerable() - 所以這應該工作:

var model = Session.Query<Contact>() 
        .Where(c => c.UserId == this.userId) 
        .AsEnumerable() 
        .Select(c => new SelectListItem { 
            Text = c.FullName, 
            Value = c.Id }) 
        .ToList(); 

(我在對象初始轉換new SelectListItem()new SelectListItem表達也是如此,但這真的是一個沒有操作。)

+0

感謝您的答案。我不喜歡我們從文檔中提取所有數據,但我想它必須能夠工作。假設聯繫人文檔中包含大量數據,您是不是希望Linq提供程序處理選擇而不是獲取所有數據? –

+0

@BrettAllred:是的,絕對 - 我建議你在場景中針對Raven提出一個錯誤。 –

+2

我能夠重現在RavenDB 1.0.960中爲空的.Id屬性,但不是在當前的1.2不穩定版本中。因此,我會說這是一個已經被修復的錯誤。 1.2與RTM非常接近(根據Ayende),所以如果可以的話,我現在可以切換。 –

相關問題