我有一個功能,其目的是從資料庫中通過其 id 拉出拍賣,并包括它的最高出價和最高出價的型別。
我能夠使用這條線獲得最高出價
var result = _context.Auctions.
Include(a => a.AuctionBids.OrderByDescending(b => b.BidAmount).Take(1)).
FirstOrDefault(a => a.AuctionId == id);
當我添加其余部分以包括我使用的出價型別時
var result = _context.Auctions.
Include(a => a.AuctionBids.OrderByDescending(b => b.BidAmount).Take(1)).ThenInclude(b => b.AuctionBidType).AsNoTracking().
FirstOrDefault(a => a.AuctionId == id);
但后來我得到一個錯誤
Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid column name 'AuctionBidTypeID'.
Invalid column name 'AuctionBidID'.
Invalid column name 'AuctionBidTypeID'.
Invalid column name 'BidAmount'.
Invalid column name 'BidDate'.
Invalid column name 'ExternalUserLoginID'.
按預期拆除.Take(1)工程,回傳所有投標。我試過四處走動,.Take(1)但我只是得到一個空回應或編譯器錯誤。任何能指出我正確方向的東西都值得贊賞
我還檢查了使用First()代替Take(1)它給出了這個錯誤
System.InvalidOperationException:運算式 'a.AuctionBids.AsQueryable().OrderByDescending(b => b.BidAmount).First()' 在 'Include' 操作中無效,因為它不代表屬性訪問:'t = > t.MyProperty'。要定位在派生型別上宣告的導航,請使用強制轉換 ('t => ((Derived)t).MyProperty') 或 'as' 運算子 ('t => (t as Derived).MyProperty')。集合導航訪問可以通過組合 Where、OrderBy(Descending)、ThenBy(Descending)、Skip 或 Take 操作進行過濾。有關包含相關資料的詳細資訊,請參閱http://go.microsoft.com/fwlink/?LinkID=746393。
簡化類
這些是我的模型的簡化版本
public partial class Auction
{
public Auction()
{
AuctionBids = new HashSet<AuctionBid>();
}
public long AuctionId { get; set; }
public long AuctionTypeId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string LongDescription { get; set; }
public decimal BidIncrement { get; set; }
public decimal BidWarningCap { get; set; }
public decimal Reserve { get; set; }
public int CreatedById { get; set; }
public DateTime CreatedDate { get; set; }
public virtual AuctionType AuctionType { get; set; }
public virtual ICollection<AuctionBid> AuctionBids { get; set; }
}
public partial class AuctionBid
{
public long AuctionBidId { get; set; }
public long AuctionId { get; set; }
public int ExternalUserLoginId { get; set; }
public long AuctionBidTypeId { get; set; }
public DateTime BidDate { get; set; }
public decimal BidAmount { get; set; }
public virtual Auction Auction { get; set; }
public virtual AuctionBidType AuctionBidType { get; set; }
}
public partial class AuctionBidType
{
public AuctionBidType()
{
AuctionBids = new HashSet<AuctionBid>();
}
public long AuctionBidTypeId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<AuctionBid> AuctionBids { get; set; }
}
uj5u.com熱心網友回復:
這似乎是 EF-core 5 中的一個錯誤。生成的 SQL 查詢(使用 SQL Server)在一行中有不正確的別名:
SELECT [t].[AuctionId], [t].[AuctionTypeId], [t].[BidIncrement], [t].[BidWarningCap], [t].[CreatedById], [t].[CreatedDate], [t].[Description], [t].[LongDescription], [t].[Name], [t].[Reserve], [t1].[AuctionBidId], [t1].[AuctionBidTypeId], [t1].[AuctionId], [t1].[BidAmount], [t1].[BidDate], [t1].[ExternalUserLoginId], [t1].[AuctionBidTypeId0], [t1].[Description], [t1].[Name]
FROM (
SELECT TOP(1) [a].[AuctionId], [a].[AuctionTypeId], [a].[BidIncrement], [a].[BidWarningCap], [a].[CreatedById], [a].[CreatedDate], [a].[Description], [a].[LongDescription], [a].[Name], [a].[Reserve]
FROM [Auctions] AS [a]
WHERE [a].[AuctionId] = CAST(1 AS bigint)
) AS [t]
OUTER APPLY (
-- Wrong aliases in line below. [t] should be [t0]
SELECT [t].[AuctionBidId], [t].[AuctionBidTypeId], [t].[AuctionId], [t].[BidAmount], [t].[BidDate], [t].[ExternalUserLoginId], [a1].[AuctionBidTypeId] AS [AuctionBidTypeId0], [a1].[Description], [a1].[Name]
FROM (
SELECT TOP(1) [a0].[AuctionBidId], [a0].[AuctionBidTypeId], [a0].[AuctionId], [a0].[BidAmount], [a0].[BidDate], [a0].[ExternalUserLoginId]
FROM [AuctionBid] AS [a0]
WHERE [t].[AuctionId] = [a0].[AuctionId]
ORDER BY [a0].[BidAmount] DESC
) AS [t0] -- This alias
INNER JOIN [AuctionBidType] AS [a1] ON [t].[AuctionBidTypeId] = [a1].[AuctionBidTypeId]
) AS [t1]
ORDER BY [t].[AuctionId], [t1].[BidAmount] DESC, [t1].[AuctionBidId], [t1].[AuctionBidTypeId0]
當我在不同的資料庫模型上嘗試類似的查詢時,會采用正確的別名,但我無法斷定查詢中的哪個部分或類/屬性名稱混淆了 EF。
幸運的是,您可以使用解決方法(至少,我可以使用您的模型):
var result = _context.Auctions.AsNoTracking()
.Include(a => a.AuctionBids.OrderByDescending(b => b.BidAmount).Take(1))
.ThenInclude(b => b.AuctionBidType)
.Where(a => a.AuctionId == id)
.AsEnumerable()
.FirstOrDefault();
這似乎FirstOrDefault(a => a.AuctionId == id)是混淆查詢生成器的部分。將其替換為Where使查詢運行。那么這只是切換到記憶體評估(.AsEnumerable())并.FirstOrDefault()在那里應用的問題。
在 EF-core 6 中,此錯誤已修復。[t1]在上面的查詢有[t]和的地方使用別名[t0]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/473956.html
標籤:C# 实体框架 实体框架核心 ef-core-5.0
上一篇:如何合并兩個物件并保持計數
