我需要返回一个客户端列表,它们与使用LINQ的独立表中提供的标识字段相匹配。该SQL语句将如下所示,如果它是在一个存储过程:有条件的情况下加入
Select client.*
From ADLT_Clients as client
Inner Join ADLT_ClientIdentifiers as identifier
on client.ClientPIN = identifier.ClientPIN
Where identifier.EmailAdrs = @EmailAddress
and identifier.FBINum = @FBINumber
(...)
我试图用为此在LINQ如下:
Public Function FindByIndentifiers(adultClient As AdultClient) As List(Of AdultClient)
Dim adultClients As New List(Of AdultClient)
Dim clients = From client As ADLT_Client In _cmisiiEntities.ADLT_Clients
Join identifier In _cmisiiEntities.ADLT_ClientIdentifiers On client.ClientPIN Equals identifier.ClientPIN
Select client
If adultClient.AdultClientIdentifiers IsNot Nothing Then
With adultClient.AdultClientIdentifiers
If Not String.IsNullOrEmpty(.EmailAddress) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.EMailAdrs.Contains(.EmailAddress))
If Not String.IsNullOrEmpty(.FBINumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.FBINum.Contains(.FBINumber))
If Not String.IsNullOrEmpty(.ICOTSNumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.ICOTSNum.Contains(.ICOTSNumber))
If Not String.IsNullOrEmpty(.InmateNumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.InmateNum.Contains(.InmateNumber))
If Not String.IsNullOrEmpty(.LicenseNumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.LicenseNum.Contains(.LicenseNumber))
If Not String.IsNullOrEmpty(.LicenseNumberState) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.LicenseNumState.Contains(.LicenseNumberState))
If Not String.IsNullOrEmpty(.PassportNumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.PassportNum.Contains(.PassportNumber))
If Not String.IsNullOrEmpty(.AlienRegistrationNumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.GreenCardNum.Contains(.AlienRegistrationNumber))
If Not String.IsNullOrEmpty(.SocialSecurityNumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.SSN.Contains(.SocialSecurityNumber))
If Not String.IsNullOrEmpty(.SPBINumber) Then clients = clients.Where(Function(f) f.ADLT_ClientIdentifiers.SPBINum.Contains(.SPBINumber))
End With
End If
For Each client In clients.Take(100).ToList()
adultClients.Add(BuildAdultClient(client))
Next
Return adultClients
End Function
此代码时,没有有效的参数执行,没有任何where子句被添加并且clients.Take(100).ToList()语句执行正常。如果我包含任何有效的参数,因此添加一个where子句,则该语句会在ToList()调用中提供NullReferenceException。
我的理论是,有一个别名问题,我试图添加where子句。当where子句是初始语句的一部分时,我使用join语句创建的标识符别名。如果我修改我的说法是:
Dim clients = (From client As ADLT_Client In _cmisiiEntities.ADLT_Clients
Join identifier In _cmisiiEntities.ADLT_ClientIdentifiers On client.ClientPIN Equals identifier.ClientPIN) _
.Where(Function(f) f.identifier.EMailAdrs.Contains(adultClient.EmailAddress)) _
.Select(Function(f) f.client)
代码也会执行。这里的区别是我正在通过定义的标识符别名。我不能在我的条件where语句中执行相同的f.identifier.EmailAdrs,因为标识符不是该上下文的一部分?
我在这里错过了什么,有没有更好的方法来正确地做到这一点,或者这是VB的限制吗?
我不得不怀疑这是一个VB问题与表达式有问题在你身边使用'With'子句 – Maslow