我如何 select 来自 2sxc 数据流的随机项目?
How can I select a random item from a 2sxc Data stream?
我想在网站的每个页面上显示随机报价。如果我尝试使用 Content,它可以工作,但每个模块都有自己的内容。当我切换到使用数据时,我似乎无法随机 select 列表中的项目。我的内容类型 'Quotation' 只有一个字段,名为 'Quotation'.
这是一个使用内容的测试:
<div>
<h2>@Dnn.Module.ModuleTitle</h2>
<div class="sc-element">Add more items to the list and see which one is selected at random.@Edit.Toolbar(ListContent)</div>
@{
Random rnd = new Random();
int r = rnd.Next(List.Count);
int rp1 = r + 1;
}
<div class="sc-element">Number @rp1, <i>@List[r].Content.Quotation</i>, was selected from this list of @List.Count items: </div>
<ol>
@foreach(var e in List) {
var Content = e.Content;
<li class="sc-element">
@Edit.Toolbar(Content)
@Content.Quotation
</li>
}
</ol>
如果我对数据流尝试类似的操作,我无法随机访问列表项。这是代码:
@using ToSic.Eav.DataSources
<div class="BasicContentWithPreview sc-element">
@Edit.Toolbar(ListContent)
<h2><span>Random: @Dnn.Module.ModuleTitle</span></h2>
@{
var allQuotes = CreateSource<EntityTypeFilter>();
allQuotes.TypeName = "Quotation";
}
@{
var ql = allQuotes.List;
Random rnd = new Random();
int r = rnd.Next(ql.Count);
int rp1 = r + 1;
}
<div class="sc-element">Number @rp1, <i>@AsDynamic(ql[r].Quotation)</i>, was selected from this list of @ql.Count items: </div>
<ol>
@foreach (var q in ql)
{
var item = AsDynamic(q.Value);
<li class="sc-element">[@item.EntityId] @item.Quotation</li>
}
</ol>
</div>
错误说:
'ToSic.Eav.IEntity' does not contain a definition for 'Quotation' and no extension method 'Quotation' accepting a first argument of type 'ToSic.Eav.IEntity' could be found
当我删除 ql[r]
部分时,一切正常,底部的列表是完美的。所以我可以按顺序访问列表中的项目,但不能随机访问它们。我试过很多组合。关于如何正确执行此操作的任何想法?谢谢。
从 2sxc 8.10 开始有一个 Shuffle-Data Source - http://2sxc.org/en/blog/post/releasing-2sxc-8-10-public-rest-api-visual-query-and-webapi-shuffle-datasource
您可以在可视查询中使用它,或使用 CreateSource<...> 来使用它。这应该适合你
您还可以使用 LINQ 语句,因为您可以查看随机播放以了解它是如何工作的https://github.com/2sic/eav-server/blob/master/ToSic.Eav.DataSources/Shuffle.cs
希望对您有所帮助,如果是,请标记为已回答:)
我想在网站的每个页面上显示随机报价。如果我尝试使用 Content,它可以工作,但每个模块都有自己的内容。当我切换到使用数据时,我似乎无法随机 select 列表中的项目。我的内容类型 'Quotation' 只有一个字段,名为 'Quotation'.
这是一个使用内容的测试:
<div>
<h2>@Dnn.Module.ModuleTitle</h2>
<div class="sc-element">Add more items to the list and see which one is selected at random.@Edit.Toolbar(ListContent)</div>
@{
Random rnd = new Random();
int r = rnd.Next(List.Count);
int rp1 = r + 1;
}
<div class="sc-element">Number @rp1, <i>@List[r].Content.Quotation</i>, was selected from this list of @List.Count items: </div>
<ol>
@foreach(var e in List) {
var Content = e.Content;
<li class="sc-element">
@Edit.Toolbar(Content)
@Content.Quotation
</li>
}
</ol>
如果我对数据流尝试类似的操作,我无法随机访问列表项。这是代码:
@using ToSic.Eav.DataSources
<div class="BasicContentWithPreview sc-element">
@Edit.Toolbar(ListContent)
<h2><span>Random: @Dnn.Module.ModuleTitle</span></h2>
@{
var allQuotes = CreateSource<EntityTypeFilter>();
allQuotes.TypeName = "Quotation";
}
@{
var ql = allQuotes.List;
Random rnd = new Random();
int r = rnd.Next(ql.Count);
int rp1 = r + 1;
}
<div class="sc-element">Number @rp1, <i>@AsDynamic(ql[r].Quotation)</i>, was selected from this list of @ql.Count items: </div>
<ol>
@foreach (var q in ql)
{
var item = AsDynamic(q.Value);
<li class="sc-element">[@item.EntityId] @item.Quotation</li>
}
</ol>
</div>
错误说:
'ToSic.Eav.IEntity' does not contain a definition for 'Quotation' and no extension method 'Quotation' accepting a first argument of type 'ToSic.Eav.IEntity' could be found
当我删除 ql[r]
部分时,一切正常,底部的列表是完美的。所以我可以按顺序访问列表中的项目,但不能随机访问它们。我试过很多组合。关于如何正确执行此操作的任何想法?谢谢。
从 2sxc 8.10 开始有一个 Shuffle-Data Source - http://2sxc.org/en/blog/post/releasing-2sxc-8-10-public-rest-api-visual-query-and-webapi-shuffle-datasource
您可以在可视查询中使用它,或使用 CreateSource<...> 来使用它。这应该适合你
您还可以使用 LINQ 语句,因为您可以查看随机播放以了解它是如何工作的https://github.com/2sic/eav-server/blob/master/ToSic.Eav.DataSources/Shuffle.cs
希望对您有所帮助,如果是,请标记为已回答:)