我有一个对象 BankAccount
我想检查LINQ查询中的匹配项。
还有另一个 LenderAccount
对象,其中引用了 BankAccount
实体。
最后,对象 LoanConnection
引用了 LenderAccount
。我正在寻找具有特定 BankAccount
的所有连接。
以下是代码:
var bankAccount = accountService.GetBankAccountById(1);
var lenderCons = lenderConnectionService.List().Where(c => c.LenderAccount.BankAccount == bankAccount).ToList();
以上查询似乎有效。但我想在LINQ中我们需要检查基本数据类型的条件(如:整数,字符串,双等),如下面的代码。
var bankAccount = accountService.GetBankAccountById(1);
var lenderCons = lenderConnectionService.List().Where(c => c.LenderAccount.BankAccount.Id == bankAccount.Id).ToList();
我在这里做错了什么,或者LINQ是否允许在 ==
运算符的条件下检查对象类型属性?
答案 0 :(得分:4)
LINQ where
语句只是将集合的每个对象与bankAccount
进行比较。是的,您可以在此声明中使用您想要的任何类型。
但在您的代码中,它会将仅链接与对象进行比较。这是引用类型的默认行为
我认为,目前,引用属于同一个对象,一切正常。但是在内存中创建对象并链接到它们,它是CLR
的工作,它可能会随版本而变化。
因此,我建议您为BankAccount
类型实现重写的比较方法(MSDN解释和示例)。您无法知道对象是否引用了内存中的同一对象。
而且,在被覆盖的比较中,您需要手动检查id
是否相等。然后你可以使用通常的对象比较(你的第一个例子),而不是猜测它是否会起作用。
答案 1 :(得分:0)
正如您所解释的以及我所理解的,您正在尝试实现具有相同银行帐户的所有这些连接。
您在第一个使用' =='比较bankAccount对象的代码中尝试执行的操作运营商。
来自MSDN,
对于预定义的值类型,如果操作数的值相等,则等于运算符(==)返回true,否则返回false。对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true。对于字符串类型,==比较字符串的值。
因此,更准确地说,比较他们的身份更为可取。即,
var bankAccount = accountService.GetBankAccountById(1);
var lenderCons = lenderConnectionService.List().Where(c => c.LenderAccount.BankAccount.Id == bankAccount.Id).ToList();
答案 2 :(得分:0)
目前还不清楚你在 lenderConnectionService 中做了什么,但是如果你没有对数据库执行查询,那么它将起作用。但是,如果您已经在EF中执行了查询并关闭了 延迟加载,那么它将无法正常工作。比较 Ids 总是更好。
在您的DbContext中,您可以启用/禁用延迟加载。
Configuration.LazyLoadingEnabled = true/false;
关闭延迟加载后,您可以使用包含功能检索相关实体,再次点击here。