簡體   English   中英

嵌套集合的屬性上的 EF Core sum 不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM