LINQ 查询我可以在 where 条件下将对象类型 属性 与另一个对象匹配吗

LINQ query can I match object type property with another object in where condition

我有一个对象 BankAccount,我想在 LINQ 查询中检查它是否匹配。

还有另一个对象 LenderAccount 引用了 BankAccount 实体。

最后一个对象 LoanConnection 引用了 LenderAccount。我正在寻找具有特定 BankAccount.

的所有连接

代码如下:

var bankAccount = accountService.GetBankAccountById(1);
var lenderCons = lenderConnectionService.List().Where(c => c.LenderAccount.BankAccount == bankAccount).ToList();

以上查询似乎有效。但我认为在 LINQ 中我们需要使用基本数据类型(如:整数、字符串、双精度等)检查 where 条件,如下面的代码。

var bankAccount = accountService.GetBankAccountById(1);
var lenderCons = lenderConnectionService.List().Where(c => c.LenderAccount.BankAccount.Id == bankAccount.Id).ToList();

我是不是做错了什么,或者 LINQ 是否允许在 where 条件下使用 == 运算符检查对象类型 属性?

正如您所解释的和我所理解的,您正试图实现所有具有相同银行帐户的连接。
您在第一个代码中尝试执行的操作是使用“==”运算符比较 bankAccount 对象。 来自 MSDN

For predefined value types, the equality operator (==) returns true if the values of its operands are equal, false otherwise. For reference types other than string, == returns true if its two operands refer to the same object. For the string type, == compares the values of the strings.

因此,为了更准确,比较他们的 ID 更可取。即,

var bankAccount = accountService.GetBankAccountById(1);
var lenderCons = lenderConnectionService.List().Where(c => c.LenderAccount.BankAccount.Id == bankAccount.Id).ToList();

目前还不清楚您在 lenderConnectionService 中做什么,但如果您没有对数据库执行查询,它将起作用。但是,如果您已经在 EF 中执行了查询并且 关闭了 延迟加载 那么它将 不起作用 .比较 Ids.

总是更好

在您的 DbContext 中,您可以 enable/disable 延迟加载

Configuration.LazyLoadingEnabled = true/false;

关闭 延迟加载 后,您可以使用函数 Include 检索相关实体,阅读更多 here.

LINQ where 语句只是将集合中的每个对象与您的 bankAccount 进行比较。是的,您可以在此声明中使用任何类型。

但在您的代码中,它仅比较对象的链接。这是引用类型的默认行为。
我认为,目前,引用是对同一个对象,并且一切正常。但是在内存中创建对象并链接到它们,这是一项 CLR 的工作,并且它可能会因版本而异。

因此,我建议您为您的 BankAccount 类型实施覆盖的比较方法(MSDN 解释和示例)。您无法知道对象是否引用内存中的同一个对象。

并且,在覆盖比较中,您将需要手动检查 id 是否相等。然后你可以使用通常的对象比较(你的第一个例子)而不用猜测它是否有效。