使用LINQ和Lucene查询带有实时投影的索引
我使用以下语法定义了索引:使用LINQ和Lucene查询带有实时投影的索引,linq,lucene.net,ravendb,Linq,Lucene.net,Ravendb,我使用以下语法定义了索引: public class TestCasesForConfigurationModeIndex : AbstractIndexCreationTask<TestCase> { TestCasesForConfigurationModeIndex() { Map = docs => from x in docs select new { x.CurrentName } Indexe
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 { ... }
}
}
public类TestCasesForConfigurationModeIndex
:AbstractIndexCreationTask
{
TestCasesForConfiguration ModeIndex()测试用例
{
Map=docs=>从文档中的x选择新的{x.CurrentName}
添加(x=>x.CurrentName,FieldIndexing.Analyzed);
TransformResults=…选择新的TestCaseForConfigurationMode{…}
}
}
通过Raven Studio查询此索引的工作与预期一样,但是如何使用LINQ API执行相同的查询?问题是“As”扩展方法不适用于IDocumentQuery,而仅适用于
var query=\u 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();
var results=\u db.Advanced.LuceneQuery()
.WhereEquals(x=>x.CurrentName,searchExpression).Fuzzy((十进制)0.5);
.AsQueryable().As().ToArray();
这种方法很有效(服务器控制台显示“结果:7个总数中有7个返回”。这是正确的),但我没有返回任何结果(空数组)。您可能需要使用:
using Raven.Client.Linq;
要导入As扩展方法,请尝试使用.OfType()
而不是.As()
。它们是相同功能的同义词
此外,您不一定需要转换结果才能使用它(取决于您正在做什么)。您可以使用,例如:
Session.Advanced.LuceneQuery<IndexModel, Index>()
.Where("Name:(Bill) ...")
.SetResultTransformer("MyResultTransformer")
.SelectFields<MyResultTransformer.Result>()
.ToList();
Session.Advanced.LuceneQuery()
.其中(“姓名:(账单)……”)
.SetResultTransformer(“MyResultTransformer”)
.SelectFields()
.ToList();
确保As扩展方法中的结果传输器(本例中为MyResultTranformer)对IQueryable类型的对象有效,但lucene查询的类型为IDocumentQuery,它不实现IQueryable。我现在使用了以下脏的解决方法,但希望有一个更好的现成解决方案:var serializer=JsonExtensions.CreateDefaultJsonSerializer();var results=query.QueryResult.results.Select(x=>serializer.Deserialize(新的RavenJTokenReader(x),typeof(TestCaseForConfigurationMode))).ToArray();