我有以下查詢:
var truckCount = await DbContext.Trucks
.Where(t => t.Departure == null)
.CountAsync();
var firstTruck = await DbContext.Trucks
.Where(t => t.Departure == null)
.MinAsync(t => t.Arrival);
var railcarCount = await DbContext.Railcars
.Where(r => r.Departure == null)
.CountAsync();
var firstRailcar = await DbContext.Railcars
.Where(t => t.Departure == null)
.MinAsync(t => t.Arrival);
誰能告訴我是否可以將這些查詢合并為一個,以便只有一次往返資料庫?
我希望生成一個類似這樣的查詢。
select
(select count(*) from Trucks where Departure is null) as TruckCount,
(select min(Arrival) from Trucks where Departure is null) as FirstTruck,
(select count(*) from Railcars where Departure is null) as RailcarCount,
(select min(Arrival) from Railcars where Departure is null) as FirstRailcar
我的后端是 SQL Server。
uj5u.com熱心網友回復:
您需要使用第三方庫,該庫可以在一次往返資料庫中執行多個查詢。也許這個帶有未來查詢的擴展對你有用。
否則,您可以實作一個存盤程序來封裝查詢(作為子查詢)并回傳所需的資訊。
另一種選擇可能是只使用 2 個查詢而不是 4 個:
var truckInfo = await DbContext.Trucks
.GroupBy(t => t.Departure == null)
.Where(g => g.Key == true)
.Select(g => new { Count = g.Count(), FirstTruck = g.Min(t => t.Arrival) })
.FirstOrDefaultAsync() ?? new { Count = 0, FirstTruck = DateTime.MinValue };
// same for Railcars
uj5u.com熱心網友回復:
不是 linq,不是。為什么?因為兩個原因:
- 查詢語法無法獲取計數并使用聯合從一個查詢中獲取
- 方法計數,是立即執行而不是延遲,因此您不能鏈接到一個查詢
老實說,即使使用 sql 查詢也很難實作,因為資料具有不同的資料型別和列。
uj5u.com熱心網友回復:
以防萬一,有 EF Core 擴展linq2db.EntityFrameworkCore(請注意,我是創建者之一)可以通過 LINQ 運行此查詢和幾乎任何 SQL ANSI 查詢
using var db = DbContext.CreateLinqToDBConnection();
var trucks = DbContext.Trucks
.Where(t => t.Departure == null);
var railcars = DbContext.Railcars
.Where(r => r.Departure == null);
var result = await db.SelectAsync(() => new
{
TruckCount = trucks.Ccount(),
FirstTruck = trucks.Min(t => t.Arrival),
RailcarCount = railcars.Count(),
FirstRailcar = railcars.Min(t => t.Arrival)
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429114.html
上一篇:Blazor的IDbContextFactory:何時使用CreateDbContextAsync異步版本與CreateDbContext
下一篇:物體框架在比較之前更改列值
