C# EF核心错误:";不支持对实体类型进行比较,因为它是无键实体;在进行外部连接时

C# EF核心错误:";不支持对实体类型进行比较,因为它是无键实体;在进行外部连接时,c#,sql-server,asp.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,Entity Framework Core,我有两张桌子。一个用于发票,一个用于付款。 invoice表的架构如下所示 public class Invoice { public Guid ID {get;set;} public string InvoiceNum {get;set;} public decimal Amount {get;set;} } public class Payment { public Guid ID {get;set;} public InvoiceID {get;set;}

我有两张桌子。一个用于发票,一个用于付款。 invoice表的架构如下所示

public class Invoice
{
  public Guid ID {get;set;}
  public string InvoiceNum {get;set;}
  public decimal Amount {get;set;}  
}
public class Payment
{
  public Guid ID {get;set;}
  public InvoiceID {get;set;}
  public decimal PaidAmount {get;set;}
  public DateTimeOffset? VoidDate {get;set;}
  public virtual Invoice Invoice { get; set; }
}
付款表的模式如下所示

public class Invoice
{
  public Guid ID {get;set;}
  public string InvoiceNum {get;set;}
  public decimal Amount {get;set;}  
}
public class Payment
{
  public Guid ID {get;set;}
  public InvoiceID {get;set;}
  public decimal PaidAmount {get;set;}
  public DateTimeOffset? VoidDate {get;set;}
  public virtual Invoice Invoice { get; set; }
}
我想得到所有未全额付款的发票。首先,我声明了一个名为PaymentStatus的实体

public class PaymentStatus
{
  public Guid InvoiceID {get;set;}
  public decimal TotalPaidAmount {get;set;}
}
然后在我的DbContext类中

public virtual DbSet<Invoice> Invoices { get; set; }

public virtual DbSet<PaymentStatus> PaymentStatuses { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
            modelBuilder.Entity<PaymentStatus>().ToQuery(() =>
                Payment.Where(r => r.VoidDate == null)
                    .GroupBy(r => r.InvoiceID)
                    .Select(r => new PaymentStatus{ InvoiceID = r.Key, TotalPaidAmount = r.Sum(p => p.PaidAmount) }))
                .HasNoKey()
                .HasOne(r=>r.Invoice)
                .WithOne().HasForeignKey<PaymentStatus>(r=>r.InvoiceID);
}
如果更改为

PaidAmount = pay.TotalPaidAmount 
然后它在UnitTest(使用InMemory数据库)中工作,但在SQL Server中失败,因为转换后的SQL使用

WHERE (inv.Amount > pay.PaidAmount)
如果发票未付款,则PaymentStatus没有发票的相应记录,因此pay.PaidAmount为空(非零)。不满足库存金额>空

我正在使用EntityFrameworkCore 3.1.5

我不明白的是为什么

pay==null ? 0 : pay.TotalPaidAmount

抛出错误以及如何解决它

我通过使TotalPaidAmount在PaymentStatus中为空来解决这个问题

public class PaymentStatus
{
  public Guid InvoiceID {get;set;}
  public decimal? TotalPaidAmount {get;set;}
}
然后更改“获取应收款”中的查询

public Task<List<Receivables>> GetReceivables()
{
  var qry = from inv in MyDbContext.Invoices
    from pay in MyDbContext.PaymentStatuses.Where(p => p.InvoiceID == inv.ID).DefaultIfEmpty()
    select new Receivables
    {
      InvoiceID = inv.ID,
      InvoiceAmount = inv.Amount,
      PaidAmount = pay.TotalPaidAmount ?? 0,
    };
  return qry.Where(r=>r.InvoiceAmount > r.PaidAmount ).ToListAsync();
}
public任务getresponses()
{
var qry=来自MyDbContext.Invoices中的inv
从MyDbContext.PaymentStatuses.Where(p=>p.InvoiceID==inv.ID)中的pay.DefaultIfEmpty()
选择新的应收账款
{
发票ID=发票ID,
发票金额=发票金额,
PaidAmount=pay.TotalPaidAmount±0,
};
返回qry.Where(r=>r.InvoiceAmount>r.PaidAmount.toListSync();
}