c# - 我需要一种技术来包含请求记录中的每个要求(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>();
}
解决方案
所以你的问题是自引用父/子关系(RequestGroupMain.Children
)。
正如您发现的那样,仅使用一个查询就不适用于 EF 核心。您可以使用
context.Entry(theRequestGroupMain).Reference(rgm => rgm.Visualizations).Load()
有一些循环和递归。当然,如果需要在一个请求中获取大量嵌套数据,则可能会导致查询过多。
您也可以使用一些组合
Include(rgm => rgm.Children).ThenInclude(...)
直到一定深度,然后通过多次调用ReferenceEntry.Load()
.
如果这不可行(例如出于性能原因),您仍然可以采用“原始 SQL”路径。为此,您的查询需要使用“递归公用表表达式 (CTE)”。只需谷歌搜索“递归 CTE 父子层次结构 SQL 服务器”之类的东西。
推荐阅读
- angular - Angular 如何使用 combineLatest 组合来自网站 url 栏的路由和查询
- npm - 如何在创建新的 Angular 8 项目时修复此 json 错误
- java - Drools 在 camelCase 中查找 Java 类,引发 NoClassDefFoundError
- c++ - C ++管理大量图像缓冲区
- objective-c - 为什么 setTitleEdgeInsets 在 iOS 13 中不起作用?目标 - C
- uno-platform - GetFileFromApplicationUriAsync、CopyAsync、AsStreamForRead 未在 Uno 平台中实现。解决方法?
- php - 如何以编程方式更新 Prestashop 产品状态?
- ubuntu - 如何指定用户定义的存档目录以运行“apt install ./
" - c - 它在 C 中是如何工作的?(实现 strcat 函数)
- java - Java 编译器是否存在“赋值无效”警告/错误的错误