Мы используем Entity Framework Core 3 с базой данных SqlServer. Бизнес-программе необходимо создать много столбцов, которых нет в базе данных, из-за хранения, высокой стоимости запросов и т. Д. c. В настоящее время команда копирует весь слой базы данных и создает еще один слой, добавляя вычисляемые элементы в новые сущности. В настоящее время берется слой базы данных и применяется AutoMapper к новому слою. По какой-то причине это не похоже на оптимальный метод.
В этом примере нам требуются вычисляемые члены с именем
FullName => FirstName + LastName
AccountValue => Quantity * StockPrice
Entity Framework 3 больше не разрешает оценку на стороне клиента, https://devblogs.microsoft.com/dotnet/announcing-ef-core-3-0-and-ef-6-3-general-availability/ так любопытно, что такое стандартизированный способ для вычисляемых элементов в Entity Framework Core 3?
Читая эту статью, любопытно узнать, что актуально и что можно использовать? Или Entity Framework Core 3 предлагает новый синтаксис?
https://daveaglick.com/posts/computed-properties-and-entity-framework
1) Мы могли бы материализовать сущности. Кажется, все в порядке, однако это заставляет разработчика помнить, что при использовании ToList () возникали проблемы, из-за которых разработчики забывали, вызывая длинные запросы на сканирование базы данных или ошибки оценки на стороне клиента.
var result = ctx.Customers
.ToList()
.Select(c => new
{
FullName = c.FullName,
AccountValue = c.AccountValue
});
2) Создать расширение Queryable. Это только извлекает вычисляемые столбцы или вынуждает разработчиков создавать вычисляемые элементы в одном классе (нарушает идею единой ответственности SRP). Если нет альтернативной модификации, которая решает эту проблему. Это также приводит к проблемам в составной цепочке и возможным проблемам с производительностью, таким как опция 1.
public static IQueryable<CustomerData> SelectCustomerData(this IQueryable<Customer> customers) { return customers.Select(c => new CustomerData {
FullName = c.FirstName + " " + c.LastName,
AccountValue = c.Holdings.Sum(h => h.Quantity * h.Stock.Price) }); }
3) Проекция выражений, не позволяет присваивать в Select без Linq Expression Project. Компания не допускает использование этого стороннего инструмента, если только он не создан Microsoft.
public readonly Expression<Func<Customer, decimal>> AccountValueExpression = c => c.Holdings.Sum(h => h.Quantity * h.Stock.Price);
Или Entity Framework Core 3 предлагает новый синтаксис?
Решение должно быть там, где (а) человек может извлечь некоторые или все существующие члены исходного DBEntity, (b) и некоторые или все новые члены,
Пример, необходимо FirstName (Existing) и AccountValue (New Member)
или FullName , FirstName, LastName, StockPrice,
Или Все, FirstName, LastName, FullName, Количество, StockPrice, AccountValue, et c, et c
Любое сочетание или совпадение от сущностей.
На самом деле при переходе с 2.2 на Core 3, однако в 2.2 отключена оценка клиента. Нельзя использовать сторонние инструменты, такие как Linq.Translations или DelegateCompiler, если они не созданы от поставщика Microsoft.
Предпочитают не использовать столбцы SqlServer Computed, поскольку мы полагаемся на команду DBA. Кроме того, есть более сложные вычисления.