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
是否相等。然后你可以使用通常的对象比较(你的第一个例子)而不用猜测它是否有效。
我有一个对象 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
是否相等。然后你可以使用通常的对象比较(你的第一个例子)而不用猜测它是否有效。