linq 如何停止表达式树的递归性?(C# / EF)

trnvg8h3  于 2022-12-06  发布在  C#
关注(0)|答案(1)|浏览(110)

我尝试使用C#和实体框架从我的数据库中获取数据。我的问题是我有一个递归数据模型,称为“模板”,它有一个属性,称为“模板”,这是一个“模板”的ICollection。在我的查询中,我有一个.Select(PageMappings.PageMapping)。PageMapping是一个表达式树。最终它会转到一个表达式树,称为“模板Map”。如以下代码所示,此表达式树是递归的。

public static readonly Expression<Func<Data.Entities.Components.Layout.Template, Models.Components.Layout.Template>> TemplateMapping = 
    tp => new Models.Components.Layout.Template()
    {
        Title = tp.Title ?? string.Empty,
        Id = tp.HtmlId ?? string.Empty,
        Name = tp.Name ?? string.Empty,
        Alt = tp.Alt ?? string.Empty,
        //TODO Create mapping for the classes and styles
        Classes = tp.Classes.FormatStringToList(),
        Styles = tp.Styles.FormatStringToList(),

        Segments = (List<Segment>)new List<Segment>()
            .Concat(tp.Templates.AsQueryable().Select(TemplateMapping))
            .Concat(tp.Rows.AsQueryable().Select(RowMapping)).ToList()
    };

不知何故,它会继续在TemplateMapping内部调用TemplateMapping,即使“模板”的ICollection内部没有一个“模板”。
我试着添加一个.Where(x => x.Templates != null)。但这没有什么区别。
当“模板”中没有“模板”时,我如何添加一个子句来结束TemplateMapping的递归性?

uoifb46i

uoifb46i1#

谢谢你的建议!它使我从不同的Angular 看待这个问题。
我试着将它Map到查询中的一个不同的对象。这一直在工作,直到它到达“TemplateMapping”代码的递归部分。我想这会使代码很好很干净。它看起来很干净,但它没有工作。
在我的工作版本中,我等待数据。之后我按照我想要的方式Map它。
我不会把工作代码在这里,因为它几乎300行。

相关问题