Возможно ли сопоставление сложных типов с помощью SolrNet
-
28-09-2019 - |
Вопрос
Я использую Solr и SolrNet для нескольких простых сценариев в приложении ASP.NET MVC.Для сопоставлений один к одному, когда я сопоставляю один POCO с документом, все работает очень плавно.Тем не менее, мне интересно, возможно ли сопоставить более сложные сценарии, подобные приведенным ниже.По сути, у меня есть класс Auction, который содержит дочерний AuctionItem
public class Auction
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual AuctionItem {get;set;}
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
}
public class AuctionItem
{
public virtual int ID { get; set; }
public virtual string ItemName{ get; set; }
public virtual string ItemDescription{ get; set; }
public virtual Double ItemPrice{get;set;}
}
Очевидно, что я могу сопоставить элемент аукциона с атрибутами в моем коде, но мне интересно, как я могу включить, скажем, ItemName / ItemDescription / ItemPrice в мой документ Solr.Очевидно, что надежда здесь не в том, чтобы сгладить мой объектный график.Есть ли способ добиться этого?
Решение
В настоящее время это открытый вопрос (Который означает, что ты Есть возможность реализовать это! ;-)
Во всяком случае, я рекомендую выравнивать ваши классы, таким образом, это более явное, что есть только одна таблица. В словах Solr Wiki:
Solr предоставляет один стол. Хранение установленных таблиц базы данных в индексе, как правило, требует денормализации некоторых таблиц. Попытки избежать денормализации обычно проваливаются.
Другие советы
Мы решили такую проблему с помощью [JsonIgnore] и простого геттера для создания сгруппированного объекта:
public class Company
{
/// <summary>
/// Company location
/// </summary>
public Location Location => new Location(Latitude, Longitude);
// hide from json, but retrieve from solr
[JsonIgnore, SolrField("latlng_0_coordinate")]
public double Latitude { get; set; }
// hide from json, but retrieve from solr
[JsonIgnore, SolrField("latlng_1_coordinate")]
public double Longitude { get; set; }
}