【问题标题】:Searching for keywords in region body在区域正文中搜索关键字
【发布时间】:2015-01-03 17:29:38
【问题描述】:

我正在尝试在 Piranha CMS 中实现一个简单的搜索功能。这使用了一个单独的控制器和一个输入字符串“q”,它是表单 GET 调用的结果。字符串在每个空格处被拆分为一个称为关键字的字符串列表。

我已经实现了一个简单的搜索,它成功地根据标题和帖子的摘录和正文检索页面和帖子。然而,由于页面由任意区域组成,因此不能简单地直接查询这些区域。我尝试以多种方式获取区域主体的值,但最终得到 NotSupportedException 并显示以下消息:

LINQ to Entities 不支持指定的类型成员“Body”。仅支持初始化程序、实体成员和实体导航属性。

我发现如果 Body 没有映射到数据库中的列,我会得到这个。但是,信息必须存储在某个地方,因为我想使用提供的 DataContext 而不直接访问数据库,所以我想知道如何在枚举之前获取内容。

我可以看到内容是在枚举时加载的,但我想避免加载所有页面,而是在查询中进行过滤。

有人可以指导我正确的方向吗?我从控制器提供了一个 sn-p,它成功地按标题查询帖子和页面。

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
            });
        }
    }
}

提前致谢。

【问题讨论】:

    标签: c# asp.net-mvc linq-to-entities piranha-cms


    【解决方案1】:

    是的,页面的数据库结构相当复杂,为了支持各种对象作为区域体,数据被序列化为 JSON。 Body 属性实际上是一个 ignored 属性,其中包含该区域的反序列化 JSON 数据。不幸的是,该区域的“真实”主体(您可以在其上运行 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

    问候

    哈坎

    【讨论】:

    • 谢谢,我改变了 InternalBody 的可见性,它就像一个魅力。为了将来的目的,完整的页面查询现在是var pages = db.Pages.Include("Regions").Where(p => Keywords.Any(keyword => p.Title.Contains(keyword) || (p.Regions.Any(r => r.InternalBody.Contains(keyword)))));。还必须注意特殊字符,如 å/å、ä/ä等等。我已经提交了关于更改的拉取请求,因此它应该在您合并后立即在主存储库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多