正在搜索区域 body 中的关键字
Searching for keywords in region body
我正在尝试在 Piranha CMS 中实现一个简单的搜索功能。这使用了一个单独的控制器和一个输入字符串 "q",它是表单 GET-call 的结果。该字符串在每个 space 处被拆分为一个名为关键字的字符串列表。
我实现了一个简单的搜索,它根据标题和 post 的摘录和 body 成功检索了页面和 post。然而,由于页面由任意区域组成,因此不能简单地直接查询这些区域。我已尝试以多种方式获取区域 body 的值,但最终得到的是 NotSupportedException 并显示以下消息:
The specified type member 'Body' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
我发现如果 Body 没有映射到数据库中的列,我会得到这个。但是,信息必须存储在某个地方,因为我想在不直接访问数据库的情况下使用提供的 DataContext,所以我想知道如何在枚举之前获取内容。
我可以看到内容是在枚举时加载的,但我想避免加载所有页面,而是在查询中进行过滤。
有人可以指导我正确的方向吗?我提供了来自控制器的一个片段,它成功地按标题查询 posts 和页面。
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
});
}
}
}
提前致谢。
是的,页面的数据库结构比较复杂,为了支持各种对象作为区域主体,数据被序列化为JSON。 Body
属性 实际上是一个 ignored 属性,其中包含该区域的反序列化 JSON 数据。不幸的是,区域的 "real" 主体(您可以 运行 在其上进行 LINQ 查询)被隐藏以避免混淆。你可以在这里找到它:
https://github.com/PiranhaCMS/Piranha/blob/2.2.4/Piranha/Entities/Region.cs#L80
但是,您的用例是完全有效的,如果您正在针对源代码进行编译并且在 GitHub 上有一个分支,请随时将修改后的访问权限更改为 public 并向我发送请求请求。我会把它包含在下一个版本中!
如果您使用的是 NuGet 包,则必须使用一些真正的 SQL 并等待补丁发布。
我在此处的 GitHub 回购中添加了一个功能请求问题:
https://github.com/PiranhaCMS/Piranha/issues/365
此致
哈坎
我正在尝试在 Piranha CMS 中实现一个简单的搜索功能。这使用了一个单独的控制器和一个输入字符串 "q",它是表单 GET-call 的结果。该字符串在每个 space 处被拆分为一个名为关键字的字符串列表。
我实现了一个简单的搜索,它根据标题和 post 的摘录和 body 成功检索了页面和 post。然而,由于页面由任意区域组成,因此不能简单地直接查询这些区域。我已尝试以多种方式获取区域 body 的值,但最终得到的是 NotSupportedException 并显示以下消息:
The specified type member 'Body' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
我发现如果 Body 没有映射到数据库中的列,我会得到这个。但是,信息必须存储在某个地方,因为我想在不直接访问数据库的情况下使用提供的 DataContext,所以我想知道如何在枚举之前获取内容。
我可以看到内容是在枚举时加载的,但我想避免加载所有页面,而是在查询中进行过滤。
有人可以指导我正确的方向吗?我提供了来自控制器的一个片段,它成功地按标题查询 posts 和页面。
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
});
}
}
}
提前致谢。
是的,页面的数据库结构比较复杂,为了支持各种对象作为区域主体,数据被序列化为JSON。 Body
属性 实际上是一个 ignored 属性,其中包含该区域的反序列化 JSON 数据。不幸的是,区域的 "real" 主体(您可以 运行 在其上进行 LINQ 查询)被隐藏以避免混淆。你可以在这里找到它:
https://github.com/PiranhaCMS/Piranha/blob/2.2.4/Piranha/Entities/Region.cs#L80
但是,您的用例是完全有效的,如果您正在针对源代码进行编译并且在 GitHub 上有一个分支,请随时将修改后的访问权限更改为 public 并向我发送请求请求。我会把它包含在下一个版本中!
如果您使用的是 NuGet 包,则必须使用一些真正的 SQL 并等待补丁发布。
我在此处的 GitHub 回购中添加了一个功能请求问题:
https://github.com/PiranhaCMS/Piranha/issues/365
此致
哈坎