2sxc Linq查询类别

时间:2017-04-17 09:19:44

标签: c# linq 2sxc

我有实体:Documents,Category,DocList

Documents and DocumentList可以选择多个类别。

我想对一个或多个类别的文档进行过滤。

// all documents
var items = AsDynamic(App.Query["DocList"]["AllDocs"]);
// categories for filter
var fcat = Content.Category;

//linq query??
items = items.Where(d=>d.Category ....????....);

我可以和如何制作这种过滤器吗?

Content.Category是类别列表。

所以我想显示任何类别中的项目列表,而不仅仅是一个

类似这样的事:linq where list contains any in list

2 个答案:

答案 0 :(得分:1)

因此,wiki https://github.com/2sic/2sxc/wiki/DotNet-Query-Linq

中解释了部分内容

但我必须承认,对于你的问题,没有任何例子。我相信你想要的东西:

// filter - keep only those that have this Category
// note that the compare must run on the EntityId because of object wrapping/unwrapping
    items = items.Where(i => 
        (i.Category as List<dynamic>).Any(c => c.EntityId == fcat.EntityId))

所以这应该有效:)

如果fcat是一个列表的附加解决方案应该是约。像这样

// filter - keep only those that have this Category
// note that the compare must run on the EntityId because of object wrapping/unwrapping
    items = items.Where(i => 
        (i.Category as List<dynamic>).Any(c => fcat.Any(f => c.EntityId == f.EntityId)))

如果这导致错误,您可能需要将fcat转换为类似

的内容
((List<dynamic>)fcat).Any(...)

答案 1 :(得分:1)

测试:dnn 9.1.1 / 2sxc 9.14.0

我的最终代码:

@using System
@using ToSic.SexyContent
@using System.Collections.Generic
@using System.Linq
@{
    var items = AsDynamic(App.Data["Document"]);
    var tags = Content.Tags;
    items = items.Where(i => (i.Tags as List<DynamicEntity>).Any(c => ((List<DynamicEntity>)tags).Any(f => c.EntityId == f.EntityId)));
}
<div class="sc-element">
    <h1>@Content.Title</h1>
    @Edit.Toolbar(Content)
</div>
@foreach(var t in items)
{
    <div>@t.Title</div>
}

文档有字段:标题(字符串)和标记(标记实体/多个)

内容是&#34;文档列表&#34;与字段&#34;标签&#34; (标签/多个类型)

这样我的代码就可以了。