使用LINQ和Lucene查询带有实时投影的索引

时间:2013-01-05 23:15:46

标签: linq lucene.net ravendb

我已使用以下语法定义了索引:

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 { ... }
     }
}

通过Raven Studio查询此索引按预期工作,但如何使用LINQ API执行相同的查询?问题是“As”扩展方法不适用于IDocumentQuery,但仅适用于 var query = _db.Advanced.LuceneQuery() 。。如()ToArray的();

我也尝试过以下内容:

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

这种工作(服务器控制台向我显示“结果:7个总共返回7个。”这是正确的),但我没有得到任何结果(空数组)。

3 个答案:

答案 0 :(得分:3)

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

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

确保separate class

中有结果变形者(本例中为MyResultTranformer)

答案 1 :(得分:0)

您可能需要使用:

 using Raven.Client.Linq; 

导入As扩展方法。

答案 2 :(得分:-1)

尝试使用.OfType<T>()代替.As<T>()。它们是相同功能的同义词。

此外,您不一定需要转换结果才能使用它(取决于您正在做的事情)。