【发布时间】:2021-11-26 15:03:08
【问题描述】:
我正在开发一个系统,在该系统中,我获得了一个没有关系的 SQL 数据库(请不要让我开始这样做)。
我有一张表是银行账户、ID、排序代码、帐号、姓名。 我的第二个表是支付表,它有 6 个字段,用于帐号和排序代码,但我只需要匹配一对(排序代码和帐号)
所以,我有一个查询,可以像这样获取所有银行账户
var bankAccounts =
_databaseContext.BankAccounts
.Where(accounts => model.BankAccountIds
.Any(x => x == accounts.Id))
.ToList();
我正在构建一个查询并且
_databaseContext.Payments.Where(x => bankAccounts.Any(b => b.AccountNumber == x.AccountNumber)
&& bankAccounts.Any(b => b.SortCode == x.SortCode));
但是,当我运行它时,我得到了错误
ystem.InvalidOperationException:LINQ 表达式 'DbSet() .Where(p => bankAccounts_0 .Any(b => b.AccountNumber == p.AccountNumber) && bankAccounts_0 .Any(b => b.SortCode == p.SortCode))' 无法翻译。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。
所以,我需要的是能够以这样一种方式编写查询,它可以让我获得所有付款,其中付款表中的排序代码和帐号与银行帐户表匹配
而且我确实意识到,如果我们在表之间建立关系,这会简单得多,但是作为承包商,我对他们如何构建事物几乎没有影响
-- 编辑
在 OnModelCreating 的 Datacontext 中,我也在这样做,但是当播种数据时,它会死掉 - 现在只是构建以获得它抛出的异常
modelBuilder.Entity<BankAccount>()
.HasMany(payment => payment.Payments)
.WithOne(bankAccount => bankAccount.BankAccountDetails)
.HasPrincipalKey(x => new {x.AccountNumber, x.SortCode});
然后在运行代码时我得到了这个
System.InvalidOperationException:无法跟踪“BankAccount”类型的实体,因为备用键属性“AccountNumber”为空。如果备用键未在关系中使用,则考虑改用唯一索引。唯一索引可能包含空值,而备用键可能不包含。
【问题讨论】:
-
即使数据库中没有关系(假设您的意思是整个数据库中没有 FK),您仍然可以在客户端配置导航,以便 EF 知道如何进行连接.. 还想指出,您使用两个 Any 编写的查询不是一对值的连接。 “存在与支付账户匹配的任何银行账户账户并且存在与支付排序代码匹配的任何银行账户排序代码的支付”在上下文中可能只是“真”
-
你试过
Contains,而不是Any吗? -
@JohnDoe,是的,那时我得到了编译错误
-
@CaiusJard 我也试过了,但确实给我带来了一些问题,因为并非所有字段在支付表中都有值
-
也试过什么?
标签: c# linq entity-framework-core