Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с наследованием в Entity Framework Core: извлечение только базовых типов объектов

Delphi , Базы данных , ADO

Entity Framework Core (EF Core) является мощным инструментом для работы с базами данных в .NET. Одной из его особенностей является поддержка наследования, что позволяет создавать иерархии объектов, соответствующие реальному миру. Однако, при работе с наследованием может возникнуть потребность извлекать только объекты базового типа, не включая их производные. В данной статье мы рассмотрим, как это можно сделать, используя примеры кода на Object Pascal, который часто используется в среде разработки Delphi.

Проблема

Рассмотрим следующую архитектуру объектов:

  • Базовый объект Entity.
  • Производный объект Entry, который наследуется от Entity.
  • Дальнейший производный объект CancelledEntry, который наследуется от Entry.

В EntitySQL можно использовать запрос, чтобы возвращать только объекты типа Entry:

[...] where it is of (only MyEntities.Entry) [...]

Это позволяет избежать возвращения объектов типов Entity и CancelledEntry.

В LINQ to SQL запрос:

EntityContext.EntitySet.OfType<Entry>()

возвращает объекты типов Entry и CancelledEntry. Какой синтаксис или функция позволяют возвращать только объекты базового типа Entry?

Альтернативный ответ

Пользователь нашел частичное решение, добавив условие в запрос:

EntityContext.EntitySet.OfType<Entry>().Where(obj => !(obj is CancelledEntry))

Однако, это решение неэффективно, так как при добавлении новых производных типов, необходимо вносить изменения во все запросы.

Подтвержденный ответ

Рекомендуется использовать расширение метода ApplyBaseEntryFilter() для IQueryable<Entry>, которое применяет фильтр и возвращает IQueryable<Entry>. Это позволяет избежать копирования и вставки фрагментов запросов по всему приложению.

Пример реализации расширения метода

public static class QueryExtensions
{
    public static IQueryable<T> ApplyBaseEntryFilter<T>(this IQueryable<T> query) where T : Entity
    {
        return query.Where(e => e.GetType() == typeof(Entry));
    }
}

Теперь, используя расширение, запрос для извлечения только базовых объектов Entry будет выглядеть следующим образом:

var entries = EntityContext.EntitySet.ApplyBaseEntryFilter();

Это решение удобно тем, что не требует изменения запросов при добавлении новых производных классов, так как фильтрация выполняется на уровне базового класса.

Использование расширений для IQueryable является отличным способом реузить и упростить код запросов в приложении, что соответствует лучшим практикам разработки.

Пример на Object Pascal

Для разработчиков, использующих Delphi и Object Pascal, можно реализовать аналогичное расширение в виде функционала, который может быть интегрирован в существующие компоненты, например, в TQuery из DAC (Data Access Components):

type
  TEntityClass = class(TInterfacedObject)
  end;

  TEntryClass = class(TEntityClass)
  end;

  TCancelledEntryClass = class(TEntryClass)
  end;

function ApplyBaseEntryFilter<T: TEntityClass>(Source: TQuery<T>): TQuery<T>;
var
  EntityType: TTypeInfo;
begin
  EntityType := TTypeInfo(TEntryClass);
  Result := Source.Where(TQuery<T>.Constructor(Source, Function(const Entity: T): Boolean; Entity is TEntryClass));
end;

Этот код должен быть использован в контексте, где поддерживается работа с запросами на Object Pascal, и предполагается, что у вас есть соответствующие компоненты для работы с базой данных.


В заключение, работа с наследованием в Entity Framework Core требует от разработчика понимания того, как правильно применять фильтры для извлечения нужных объектов. Использование расширений методов для IQueryable позволяет упростить и автоматизировать этот процесс, делая код более чистым и поддерживаемым.

Создано по материалам из источника по ссылке.

Пример использования расширения метода для фильтрации запросов в Entity Framework Core при работе с наследованием, чтобы извлекать только объекты базового типа.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: ADO ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 20:52:42/0.0034389495849609/0