【问题标题】:I need a technique for contain every requirement in requested record (SQL-EF core)我需要一种技术来包含请求记录中的每个要求(SQL-EF 核心)
【发布时间】:2020-12-20 17:39:38
【问题描述】:

在我的 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>();
}

【问题讨论】:

  • 您能描述一下您的确切问题吗?很难理解。
  • 当然,当我在请求过程中导入“内容”记录时,我想包含该记录的要求。这些要求可能是“可视化”、“内容”、“类别”、“类别组”,所以我无法弄清楚。
  • context.ContentMain.Include(cm =&gt; cm.Visualizatios).Include(cm =&gt; cm.Contents).Include(... 怎么样?确定你已经尝试过了,但有什么不好的地方?
  • 我没有尝试,因为“RequestGroup”我的意思是我使用 Guid requestGroupId = context.ContentMain.FirstOrDefault(x=> x.Id.Equals({guid})).RequestGroupId; context.RequestGroupMain.Include(x=>x.RequestGroupMain).FirstOrDefault(x=>x.Id.Equals(requestGroupId));这是我的问题,当我得到我的“RequestGroup”时,它包括“Children”并且“Children”是无限嵌套的“RequestGroup”..我希望我能解释一下。其他一些例子,无限类别技术不适用于 EF 核心..
  • 这就是我需要的,非常感谢。因为这种情况我换了系统。但你的解决方案是这个问题的正确答案。

标签: c# sql sql-server entity-framework-core


【解决方案1】:

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

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

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

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

你也可以组合使用一些

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

直到某个深度,然后通过多次调用ReferenceEntry.Load() 进一步深入。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 2015-10-07
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多