我有一个类似于下面的模型
public class Product
{
[SolrUniqueKey("id")]
public int ID { get; set; }
[SolrField("storage")]
public string Storage { get; set; }
[SolrField("components")]
public Components Components { get; set; }
}
public class Components : List<string>
{
public Components()
{}
public Components(string[] components)
{
AddRange(components);
}
}
在我的schema.xml中,我将字段映射为:
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="storage" type="string" indexed="true" stored="true" omitNorms="true"/>
<field name="components" type="text_ws" stored="true" multiValued="true" omitNorms="true"/>
我已经向Solr索引添加了5个产品的列表。如果我从Solr管理页面查询“*”,我会得到一个结果的响应文档:
<doc>
<arr name="components">
<str>blah1</str>
<str>blah2</str>
<str>blah3</str>
</arr>
<str name="id">0</str>
<str name="storage">foo</str>
</doc>
然而,当我使用类似的东西通过Solrnet查询Solr时:
私人只读ISolrReadOnlyOperations solr var results = solr.Query(SolrQuery.All);
我发现组件始终为空。
感谢任何帮助。
我可以看到任何派生集合的这种行为。
答案 0 :(得分:1)
我想我找出了原因 - 当索引时,多值实体存储为数组,并且在反序列化时,它会转换为ArrayList。因此,在我的情况下,派生的List不能直接使用。
我吸取的教训是,我需要将我的域模型与索引模型分开 - 回想起来,这听起来像是一种很好的做法。
答案 1 :(得分:1)
您可以使用'proxy'属性执行此操作,如this answer中所述。或者您可以为您的组件类型编写ISolrFieldParser / ISolrFieldSerializer。
独立于此,我同意将您的域模型与索引模型分离通常是一个好主意。