首页 > 解决方案 > 我需要一种技术来包含请求记录中的每个要求(SQL-EF 核心)

问题描述

在我的 cms 项目中,我创建了一个“RequestGroup”表来满足当前“内容”中的所有需求,例如,我的主页“内容”中有一个小部件“内容”,所以在这种情况下我找不到方法。

目前我正在使用 EF 核心来解决这个问题。但是 EF 核心不足以解决这个问题。所以我尝试了 sql 但我也无法在 sql 上构建解决方案。需要你的帮助,任何想法都可以提供帮助。感谢您的时间..

public class ContentMain : IdBase
{
    [MaxLength(256)]
    public string Name { get; set; } = null;

    public Guid RequestGroupId { get; set; }

    [ForeignKey("DetailPage")]
    public Guid? DetailPageId { get; set; } = null;
    public virtual VisualizationMain DetailPage { get; set; } = null;

    public virtual List<SeoOptionContentMain> SeoOptions { get; set; } = new List<SeoOptionContentMain>();

    public string _parameters { get; set; }
    [NotMapped]
    public Parameters Parameters
    {
        get
        {
            try
            {
                return JsonConvert.DeserializeObject<Parameters>(_parameters);
            }
            catch
            {
                return new Parameters();
            }
        }
        set
        {
            _parameters = JsonConvert.SerializeObject(value);
        }
    }

    [ForeignKey("Category")]
    public Guid CategoryId { get; set; }
    public virtual CategoryMain Category { get; set; } = null;

    public Guid DefinitionId { get; set; }
    [NotMapped]
    public DefinitionMain Definition { get; set; }
}
public class RequestGroupMain
{
    [Key]
    public Guid Id { get; set; }
    [MaxLength(256)]
    [Required]
    public string Name { get; set; }
    public Guid? RequestGroupMainId { get; set; }

    public virtual IList<RequestGroupMain> Childen { get; set; } = new List<RequestGroupMain>();

    public virtual List<VisualizationRequestGroup> Visualizations { get; set; } = new List<VisualizationRequestGroup>();
    public virtual List<ContentRequestGroup> Contents { get; set; } = new List<ContentRequestGroup>();
    public virtual List<CategoryRequestGroup> Categories { get; set; } = new List<CategoryRequestGroup>();
    public virtual List<CategoryGroupRequestGroup> CategoryGroups { get; set; } = new List<CategoryGroupRequestGroup>();
}

标签: c#sqlsql-serverentity-framework-core

解决方案


所以你的问题是自引用父/子关系(RequestGroupMain.Children)。

正如您发现的那样,仅使用一个查询就不适用于 EF 核心。您可以使用

context.Entry(theRequestGroupMain).Reference(rgm => rgm.Visualizations).Load()

有一些循环和递归。当然,如果需要在一个请求中获取大量嵌套数据,则可能会导致查询过多。

您也可以使用一些组合

Include(rgm => rgm.Children).ThenInclude(...)

直到一定深度,然后通过多次调用ReferenceEntry.Load().

如果这不可行(例如出于性能原因),您仍然可以采用“原始 SQL”路径。为此,您的查询需要使用“递归公用表表达式 (CTE)”。只需谷歌搜索“递归 CTE 父子层次结构 SQL 服务器”之类的东西。


推荐阅读