Недавно я обновил свой проект, чтобы использовать Entity Framework Core вместо Entity Framework. В моем проекте есть запрос, время ожидания которого недавно начало истекать.
Когда я проверил профилировщик, я заметил, что запрос выполняется иначе, чем раньше:
Это запрос:
var orders = context.Orders.AsQueryable();
var orderItems = context.OrderItems.AsQueryable();
var customers = context.Customers.AsQueryable();
var statusCodes = statuses.Cast();
var paymentData = context.PaymentData.AsQueryable();
query =
from order in orders
where order.CustomerId == customerId && statusCodes.Contains(order.StatusCode)
join item in orderItems on order.OrderId equals item.OrderId into itemList
from customer in customers
where order.CustomerId == customer.CustomerId &&
order.Currency == customer.Currency &&
order.ProductType == customer.ProductType &&
order.PaymentMethodId == customer.PaymentMethodId
join payment in context.Payments.AsQueryable() on new
{ OrderId = order.OrderId, ProductType = order.ProductType.Value } equals
new { OrderId = (int)payment.OrderId, payment.ProductType } into payments
from paymentResult in payments.DefaultIfEmpty()
join paymentDetail in paymentData
on order.OrderId equals paymentDetail.OrderId into paymentDetails
select new OrderResponse
{
OrderId = order.OrderId,
CustomerId = order.CustomerId,
CustomerName = order.CustomerName,
OrderDate = order.OrderDate,
//...
};
Отношения:
Отряды OrderItems: один ко многим
Заказы клиентам: многие к одному
Заказы платежам: один ко многим (левое соединение)
< li>От заказа к платежным данным: один ко многим
exec sp_executesql N'SELECT ...
FROM [Sales].[Orders] AS [order]
LEFT JOIN [Sales].[OrderItems] AS [item] ON [order].[OrderId] = [item].[OrderId]
WHERE ([order].[CustomerId] = @__customerId_0) AND [order].[StatusCode] IN (CAST(1 AS smallint), CAST(2 AS smallint), CAST(3 AS smallint), CAST(4 AS smallint), CAST(5 AS smallint), CAST(6 AS smallint), CAST(7 AS smallint), CAST(8 AS smallint), CAST(9 AS smallint), CAST(81 AS smallint), CAST(82 AS smallint), CAST(89 AS smallint), CAST(90 AS smallint), CAST(91 AS smallint), CAST(99 AS smallint))
ORDER BY [OrderId0]',N'@__customerId_0 varchar(50)',@__customerId_0='62325234'
SELECT [customer].[CustomerId], [customer].[Currency], [customer].[ProductType]
FROM [Sales].[Customers] AS [customer]
SELECT [payment].[OrderId], [payment].[ProductType], [payment].[CollectionDueDate]
FROM [Sales].[Payments] AS [payment]
SELECT [paymentDetail].[OrderId], [paymentDetail].[AccountHolderName], [paymentDetail].[BankAccountNumber], [paymentDetail].[BankName], [paymentDetail].[IachId], [paymentDetail].[Routing]
FROM [Sales].[PaymentData] AS [paymentDetail]
Он извлекает последние три таблицы — все без каких-либо фильтров — и, поскольку у меня много данных, выполнение запроса стало занимать много времени.Кто-нибудь знает, как помочь мне решить эту проблему? Как я могу изменить свой запрос, чтобы выполнять соединение вместо отдельных запросов для каждой таблицы?
Недавно я обновил свой проект, чтобы использовать Entity Framework Core вместо Entity Framework. В моем проекте есть запрос, время ожидания которого недавно начало истекать. Когда я проверил профилировщик, я заметил, что запрос выполняется иначе, чем раньше: Это запрос: [code]var orders = context.Orders.AsQueryable(); var orderItems = context.OrderItems.AsQueryable(); var customers = context.Customers.AsQueryable(); var statusCodes = statuses.Cast(); var paymentData = context.PaymentData.AsQueryable();
query = from order in orders where order.CustomerId == customerId && statusCodes.Contains(order.StatusCode) join item in orderItems on order.OrderId equals item.OrderId into itemList from customer in customers where order.CustomerId == customer.CustomerId && order.Currency == customer.Currency && order.ProductType == customer.ProductType && order.PaymentMethodId == customer.PaymentMethodId join payment in context.Payments.AsQueryable() on new { OrderId = order.OrderId, ProductType = order.ProductType.Value } equals new { OrderId = (int)payment.OrderId, payment.ProductType } into payments from paymentResult in payments.DefaultIfEmpty() join paymentDetail in paymentData on order.OrderId equals paymentDetail.OrderId into paymentDetails select new OrderResponse { OrderId = order.OrderId, CustomerId = order.CustomerId, CustomerName = order.CustomerName, OrderDate = order.OrderDate, //... };
[/code] [b]Отношения:[/b] [list] [*]Отряды OrderItems: один ко многим Заказы клиентам: многие к одному [*]Заказы платежам: один ко многим (левое соединение) < li>От заказа к платежным данным: один ко многим [/list] Профилировщик показывает следующий результат: [code]exec sp_executesql N'SELECT ... FROM [Sales].[Orders] AS [order] LEFT JOIN [Sales].[OrderItems] AS [item] ON [order].[OrderId] = [item].[OrderId] WHERE ([order].[CustomerId] = @__customerId_0) AND [order].[StatusCode] IN (CAST(1 AS smallint), CAST(2 AS smallint), CAST(3 AS smallint), CAST(4 AS smallint), CAST(5 AS smallint), CAST(6 AS smallint), CAST(7 AS smallint), CAST(8 AS smallint), CAST(9 AS smallint), CAST(81 AS smallint), CAST(82 AS smallint), CAST(89 AS smallint), CAST(90 AS smallint), CAST(91 AS smallint), CAST(99 AS smallint)) ORDER BY [OrderId0]',N'@__customerId_0 varchar(50)',@__customerId_0='62325234'
SELECT [customer].[CustomerId], [customer].[Currency], [customer].[ProductType] FROM [Sales].[Customers] AS [customer]
SELECT [payment].[OrderId], [payment].[ProductType], [payment].[CollectionDueDate] FROM [Sales].[Payments] AS [payment]
SELECT [paymentDetail].[OrderId], [paymentDetail].[AccountHolderName], [paymentDetail].[BankAccountNumber], [paymentDetail].[BankName], [paymentDetail].[IachId], [paymentDetail].[Routing] FROM [Sales].[PaymentData] AS [paymentDetail] [/code] Он извлекает последние три таблицы — все без каких-либо фильтров — и, поскольку у меня много данных, выполнение запроса стало занимать много времени.Кто-нибудь знает, как помочь мне решить эту проблему? Как я могу изменить свой запрос, чтобы выполнять соединение вместо отдельных запросов для каждой таблицы?
При использовании C# и EF Core 8 у меня возникла очень случайная и необычная проблема.
У меня есть приложение, которое использует Docker и Kafka для обработки больших объемов данных. У меня есть несколько экземпляров одной и той же службы, которые...
Я настроил модель идентификации EF Core, чтобы иметь дополнительную информацию об отношениях UserRole.
Теперь я хотел бы извлечь настраиваемые поля, добавляемые после входа пользователя в систему. in, чтобы я мог передать их приложению.
Ниже...
Я настроил модель идентификации EF Core, чтобы иметь дополнительную информацию об отношениях UserRole.
Теперь я хотел бы извлечь настраиваемые поля, добавляемые после входа пользователя в систему. in, чтобы я мог передать их приложению.
Ниже...
Я пытаюсь запросить некоторые подписки из базы данных с помощью Entity Framework. Подписка равна другой подписке, если идентификатор пользователя, тип уведомления и канал совпадают. Я делаю это так:
// Create a list of anonymous objects that...
Я использую Entity Framework Core в проекте ASP.NET C#.
У меня есть таблица в базе данных с именем Sales и представление с именем HotSales .
Представление содержит только горячие продажи из таблицы Sales + дополнительную информацию из другой таблицы...