[英]EF Core sum on nested collection's properties does not work
我的數據庫具有以下結構:一個用戶可以擁有多個帳戶。 一個賬戶可以進行多次轉賬。
這是地圖配置。 我想在我的 DTO 中存儲有關每個用戶的信息以及他在每個帳戶中的總儲蓄。 (下面的代碼代表整個配置的一部分)。
this.CreateMap<User, UserTestModel>()
.ForMember(
utm => utm.AccountsSavings,
options => options.MapFrom(u => u.Accounts
.Select(a => a.Transfers.Sum(t => t.Amount))
.ToList()));
我對數據庫的查詢(我將 EF Core 3.1.3 與 Sqlite 數據庫一起使用)如下所示:
var resultSet = await this._dbContext.Users
.ProjectTo<UserTestModel>(this.Mapper.ConfigurationProvider)
.ToListAsync(cancellationToken)
.ConfigureAwait(false);
但是拋出以下異常。
*
System.InvalidOperationException:LINQ 表達式 'DbSet .Where(t => EF.Property>((EntityShaperExpression: EntityType: Account ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ), "Id") != null && EF.Property> ((EntityShaperExpression: EntityType: Account ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ), "Id") == EF.Property>(t, "AccountId")) .Sum(t => t.Amount)' 不能被翻譯。 以可翻譯的形式重寫查詢,或通過插入對 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的調用顯式切換到客戶端評估。
*
這是我的代碼的問題,還是我目前使用的一些框架(AutoMapper 或 EF Core)的問題?
編輯1:
我決定嘗試從User
實體手動收集該信息,但該代碼導致相同的異常,這意味着它不是 Automapper 的錯誤:
var resultSet = await this._dbContext.Users
.Select(u => u.Accounts.Select(a => a.Transfers.Sum(t => t.Amount)).ToList())
.ToListAsync(cancellationToken)
.ConfigureAwait(false);
編輯2:
在 EntityFrameworkCore 的 GitHub 上創建問題: https : //github.com/dotnet/efcore/issues/20455
我能夠使用 SQLite 提供程序重現它,並且Amount
類型為decimal
(適用於 SqlServer 提供程序)。
因此,您似乎遇到了 EF Core 文檔中的以下 SQLite 查詢限制:
SQLite 本身不支持以下數據類型。 EF Core 可以讀取和寫入這些類型的值,並且還支持查詢相等性(其中 e.Property == 值)。 但是,其他操作,例如比較和排序,將需要在客戶端上進行評估。
- 日期時間偏移
- 十進制
- 時間跨度
- UInt64
作為解決方法,請考慮從文檔中獲取建議:
Decimal
類型提供了高水平的精度。 但是,如果您不需要該級別的精度,我們建議改用 double。 您可以使用值轉換器繼續在類中使用十進制。
帶樣品
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.