2013-01-05 42 views
2

索引我已經定義的語法如下指標:使用LINQ與Lucene的查詢與現場投影

public class TestCasesForConfigurationModeIndex 
     : AbstractIndexCreationTask<TestCase> 
{ 
    TestCasesForConfigurationModeIndex() 
    { 
     Map = docs => from x in docs select new { x.CurrentName } 
     Indexes.Add(x => x.CurrentName, FieldIndexing.Analyzed); 
     TransformResults = ... select new TestCaseForConfigurationMode { ... } 
    } 
} 

查詢通過烏鴉工作室這個指標正常工作,但我怎麼能執行相同的查詢使用LINQ API?問題是「As」擴展方法不適用於IDocumentQuery,但僅適用於 var query = _db.Advanced.LuceneQuery() .As()。ToArray();

我也試過類似如下:

var results = _db.Advanced.LuceneQuery<TestCase, TestCasesForConfigurationModeIndex>() 
    .WhereEquals(x => x.CurrentName, searchExpression).Fuzzy((decimal)0.5); 
    .AsQueryable().As<TestCaseForConfigurationMode>().ToArray(); 

這種作品(在服務器控制檯顯示我「結果:7返回共有7個」,這是正確的),但我不返回任何結果(空數組)。

回答

0

您可能需要使用:

using Raven.Client.Linq; 

導入作爲擴展方法。

+0

的作爲擴展方法是有效的類型IQueryable的對象,但lucene查詢的類型是IDocumentQuery ,它不實現IQueryable。我現在使用以下骯髒的解決方法,但希望有一個更好的解決方案可用的開箱即用: var serializer = JsonExtensions.CreateDefaultJsonSerializer(); var results = query.QueryResult.Results.Select(x => serializer.Deserialize(new RavenJTokenReader(x), typeof(TestCaseForConfigurationMode))) ).ToArray(); – ollifant

-1

嘗試使用.OfType<T>()而不是.As<T>()。它們是同一功能的同義詞。

此外,您不一定需要轉換結果才能使用它(取決於您在做什麼)。

3

您可以使用SelectFields<>,例如:

Session.Advanced.LuceneQuery<IndexModel, Index>() 
    .Where("Name:(Bill) ...") 
    .SetResultTransformer("MyResultTransformer") 
    .SelectFields<MyResultTransformer.Result>() 
    .ToList(); 

確保有結果發電產品(MyResultTranformer在這個例子中)在separate class