Мне нужен метод для содержания каждого требования в запрошенной записи (ядро SQL-EF)

#c# #sql #sql-server #entity-framework-core

#c# #sql #sql-сервер #entity-framework-core

Вопрос:

В моем проекте 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>();
}
  

Комментарии:

1. Не могли бы вы описать, в чем конкретно заключается ваша проблема? Это трудно понять.

2. Конечно, когда я импортирую запись «Содержимого» в свой процесс запроса, я хочу включить требования к этой записи. Этими требованиями могут быть «Визуализация», «Содержимое», «Категория», «Категорийгруппа», поэтому я не могу понять это.

3. Как насчет context.ContentMain.Include(cm => cm.Visualizatios).Include(cm => cm.Contents).Include(... ? Уверен, что вы пробовали это, но что с этим не работает?

4. Я не пробовал это из-за «RequestGroup», я имею в виду, что я использую Guid requestGroupId = context.ContentMain. FirstOrDefault(x=> x.Id.Equals({guid})). RequestGroupId; context.RequestGroupMain. Включить (x=>x.RequestGroupMain). FirstOrDefault(x=>x.Id.Equals(requestGroupId)); Вот моя проблема, когда я получаю свою «RequestGroup», в нее включены «дочерние элементы», и эти «дочерние элементы» — это бесконечно вложенная «RequestGroup».. Я надеюсь, что я это объясню. Другой пример, метод категории бесконечности, не работает в ядре EF..

5. Это то, что мне нужно, большое вам спасибо. Я изменил систему из-за этой ситуации. Но ваше решение является правильным решением для этой проблемы.

Ответ №1:

Итак, ваша проблема заключается в самоссылающихся отношениях родитель / потомок ( RequestGroupMain.Children ).

Как вы выяснили, это не работает с ядром EF, используя только один запрос. Вы можете использовать

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

с некоторым циклом и рекурсией. Конечно, если в одном запросе необходимо извлечь много вложенных данных, это может привести к слишком большому количеству запросов.

Вы также можете использовать комбинацию некоторых

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

до определенной глубины, а затем идти дальше с несколькими вызовами ReferenceEntry.Load() .

Если это невозможно (например, по соображениям производительности), вы все равно можете пойти по пути «raw SQL». Для этого в вашем запросе необходимо использовать «рекурсивное выражение общей таблицы (CTE)». Просто найдите в Google что-то вроде «рекурсивный родительский дочерний сервер SQL Server иерархии CTE».