我有一個查詢,我將提供它的相關部分
IQueryable<a> query;
query.Where(dbEntry => dbEntry.ConditionId == id)
.Where(dbEntry => dbEntry.PharmacyStockBBD.Value > NO_BEFORE_THAN)
.GroupBy(dbEntry => dbEntry.ProductId, pair => pair, (_e1, _e2) => new
{
ProductId = _e1,
Entry = _e2.OrderBy(pair => pair.PharmacyStockBBD).First()
})
.ToListAsync();
我越來越
System.InvalidOperationException: The LINQ expression '(GroupByShaperExpression: KeySelector: (p.Id), ElementSelector:new { PharmacyStockId = (ProjectionBindingExpression: PharmacyStockId), PharmacyStockBBD = (ProjectionBindingExpression: PharmacyStockBBD), ProductId = (ProjectionBindingExpression: ProductId), ProductName = (ProjectionBindingExpression: ProductName), ChildProductId = (ProjectionBindingExpression: ChildProductId), IcnId = (ProjectionBindingExpression: IcnId), IcnName = (ProjectionBindingExpression: IcnName), PharmacyStock_ProductBoxes = (ProjectionBindingExpression: PharmacyStock_ProductBoxes), ..... } ) .OrderBy(pair => pair.PharmacyStockBBD)' could not be translated. Either rewrite the query in a form that can be translated,或通過插入對 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的呼叫顯式切換到客戶端評估。有關詳細資訊,請參閱https://go.microsoft.com/fwlink/?linkid=2101038。
我想要做的是按 ProductId 分組,但只獲取 PharmacyStockBBD 為 Min 的記錄。
我已經過
Entry = _e2.Min(pair => pair.PharmacyStockBBD)
哪個有效,但我需要整個_e2。
我也知道 GroupBy 將在 sql 引擎 (MSSSQL) 上執行,我也知道它需要一些聚合函式,但我需要整個記錄集PharmacyStockBBD。
uj5u.com熱心網友回復:
我認為最有效的方法是使用原始 sql;
context.YourTable.FromSqlInterpolated(@"
SELECT *
FROM
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY ProductId ORDER BY PharmacyStockBBD) rn
FROM YourTable
WHERE
PharmacyStockId > {NO_BEFORE_THAN}
) x
WHERE rn = 1")
您可以在此基礎上進行組合(包括更多表格等
我不確定您想在哪里進行 ConditionId 檢查;它的確有所作為。如果您在內部查詢中執行此操作,那么您將找到該條件下的所有產品,然后將它們從 1 編號并找到該條件下的最小產品。如果您在外部查詢中執行此操作,您將找到所有產品,無論其狀況如何,對它們進行編號,然后丟棄所有不在狀況中的產品。你把它放在哪里取決于第一個產品是否處于你想要的狀態
本質上,您是要“過濾條件,然后取第一個”-> 將其放在內部 where 中,還是要“取所有第一個,然后過濾條件”-> 將其放在外部 where
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/380057.html
標籤:C# 林克 实体框架核心 链接到 sql ef-core-3.1
