2015-01-03 5 views
0

Я пытаюсь реализовать простую функцию поиска в Ciran Piranha. Это использует отдельный контроллер и входную строку «q», которая является результатом формы GET-вызова. Строка разделяется на каждое пространство в список строк, называемых ключевыми словами.Поиск ключевых слов в области региона

Я добился простого поиска, который успешно извлекает страницы и сообщения, основанные на выдержке и теге заголовка и сообщения. Однако, поскольку страницы состоят из произвольных регионов, нельзя просто запросить их напрямую. Я пытался получать значение тела региона несколько способов, но я в конечном итоге получить NotSupportedException со следующим сообщением:

Указанного типа член «Body» не поддерживается в LINQ к Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности.

Я понял, что получаю это, если Body не сопоставляется с столбцом в базе данных. Тем не менее, информация должна храниться где-то, и поскольку я хотел бы использовать предоставленный DataContext без прямого доступа к базе данных, мне интересно, как получить предварительное перечисление содержимого.

Я вижу, что содержимое загружается при перечислении, но я хочу избежать загрузки всех страниц и вместо этого выполнять фильтрацию в запросе. Body loaded after enumeration

Может кто-нибудь, пожалуйста, направить меня в правильном направлении. Я предоставил фрагмент из контроллера, который успешно запрашивает сообщения и страницы по названию.

using (Piranha.DataContext db = new Piranha.DataContext()) 
{ 
    var pages = db.Pages.Include("Regions").Where(p => Keywords.Any(keyword => p.Title.Contains(keyword))); 
    var posts = db.Posts.Where(p => Keywords.Any(keyword => p.Title.Contains(keyword) || p.Excerpt.Contains(keyword) || p.Body.Contains(keyword))); 

    if (pages != null) 
    { 
     foreach (var page in pages) 
     { 
      Model.Results.Add(new SearchResultsModel.SearchResult() 
      { 
       Title = page.Title, 
       Id = page.Id 
      }); 
     } 
    } 

    if (posts != null) 
    { 
     foreach (var post in posts) 
     { 
      Model.Results.Add(new SearchResultsModel.SearchResult() 
      { 
       Title = post.Title, 
       Id = post.Id 
      }); 
     } 
    } 
} 

Заранее спасибо.

ответ

0

Да, структура базы данных для страниц довольно сложна, и для поддержки всех видов объектов как тела региона данные сериализуются как JSON. Свойством Body является фактически игнорируется свойство, которое содержит десериализованные данные JSON для региона. К сожалению, «реальное» тело региона (которое вы можете запустить запрос LINQ) скрыто, чтобы избежать путаницы. Вы можете найти его здесь:

https://github.com/PiranhaCMS/Piranha/blob/2.2.4/Piranha/Entities/Region.cs#L80

Однако ваш случай использования полностью действует, и если вы собираете против исходного кода и имеете вилку на GitHub, вы можете изменить доступ к модифицированному общественности и пришлите мне запрос на тяну. Я включу его в следующий выпуск!

Если вы используете пакеты NuGet, вам нужно будет найти какой-то реальный SQL и дождаться выхода патча.

Я добавил вопрос запроса функции на GitHub репо здесь:

https://github.com/PiranhaCMS/Piranha/issues/365

С уважением

Hakan

+0

Спасибо, я изменил видимость InternalBody и он работает как шарм , Для будущих целей полным запросом страницы является теперь 'var pages = db.Pages.Include (« Регионы »). Где (p => Keywords.Any (keyword => p.Title.Contains (keyword) || (стр. Регионы. Любой (r => r.InternalBody.Contains (ключевое слово))))); '. Следует также обратить внимание на специальные символы, такие как å/å, ä/ä et.c.Я зарегистрировал запрос на перенос изменений, поэтому он должен находиться в главном репозитории, как только вы его объедините. –

Смежные вопросы