LINQ查询可以将对象类型属性与where条件中的另一个对象匹配

时间:2015-08-20 05:29:57

标签: c# linq-to-sql

我有一个对象 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是否允许在 == 运算符的条件下检查对象类型属性?

3 个答案:

答案 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