【发布时间】:2018-07-13 01:50:30
【问题描述】:
我有这个 SQL 脚本,我需要将其转换为 Linq 以与 EF Core 一起使用:
SELECT
A.*, B.*
FROM
[Orders] AS A
JOIN
(SELECT TOP 1 WITH TIES *
FROM [OrderMeta]
ORDER BY ROW_NUMBER() OVER (PARTITION BY OrderId ORDER BY PostDate DESC)
) AS B ON (b.OrderId = A.OrderId)
这是我将其转换为的内容:
public async Task<List<GetAllOrdersResult>> AdminGetOrderList()
{
using (var db = new SoulDrawContext())
{
var query = from A in db.Orders
join B in db.OrderMeta
on A.OrderId equals B.OrderId
select new GetAllOrdersResult
{
OrderId = A.OrderId,
UserId = A.UserId,
OrderDate = A.OrderDate.ToLocalTime().ToString("yyyy-MM-dd"),
Currency = A.Currency,
Amount = A.Amount,
PaymentMethod = A.PaymentMethod,
ShipTo = A.ShipTo,
Status = B.Status,
PostDate = B.PostDate.ToLocalTime().ToString("yyyy-MM-dd hh:mm"),
RefOrderId = A.RefOrderId
};
var query1 = from a in query
group a by a.OrderId
into g
orderby g.FirstOrDefault().PostDate
select new GetAllOrdersResult
{
OrderId = g.FirstOrDefault().OrderId,
UserId = g.FirstOrDefault().UserId,
OrderDate = g.FirstOrDefault().OrderDate,
Currency = g.FirstOrDefault().Currency,
Amount = g.FirstOrDefault().Amount,
PaymentMethod = g.FirstOrDefault().PaymentMethod,
ShipTo = g.FirstOrDefault().ShipTo,
Status = g.FirstOrDefault().Status,
PostDate = g.FirstOrDefault().PostDate,
RefOrderId = g.FirstOrDefault().RefOrderId
};
return await query1.ToListAsync();
}
}
问题:
在 SSMS 中运行的 SQL 脚本运行良好,查询大约需要 32 毫秒才能完成,但 EF 内核的 linq 查询大约需要 9600 毫秒。
order表大约有2000条记录,ordermeta表有60000条记录。
待办事项
如何正确地将 SQL 脚本转换为 Linq? (或结合 2 个 linq 查询?)
如何提高查询速度?
【问题讨论】:
-
你是用分区来分页的吗?
-
函数
FirstOrDefault()不返回 iqueryable。这意味着每个g.FirstOrDefault()都会运行一个单独的查询。 -
它不用于分页,ordermeta 表正在记录订单状态,例如:已付款、已发货、退货等。我正在尝试构建一个订单列表,每个订单都包含来自 ordermeta 的最新更新。 sql 脚本工作正常,但 linq 一个不行,我猜我转换的 linq 是错误的?
-
在您的选择中使用
FirstOrDefault会使 ef 在每次调用时运行整个query查询。看看这个:docs.microsoft.com/en-us/ef/core/what-is-new/…. -
SO 并不是一个真正询问如何使 工作代码 运行得更快的网站。也许在代码审查 Stack Exchange 网站上询问?
标签: c# linq entity-framework-core