2

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の制限ですか?

4

1 に答える 1

0

linqPadでこれを行うと、linq2Sqlを使用します

Dim c as new Config with {.Category="Other"}
Dim q =from c1 in  Configs select c1

if(c isnot nothing) then
    if not string.isnullorempty(c.Category) then q=q.Where(Function(f) f.Category.Contains(c.Category))
end if
q.Dump()

それは動作しますが、私がこれを行うと

Dim c as new Config with {.Category="Other"}
Dim q =from c1 in  Configs select c1

if(c isnot nothing) then
    with c
        if not string.isnullorempty(.Category) then q=q.Where(Function(f) f.Category.Contains(.Category))
    end with
end if
q.Dump()

null参照例外をスローします。式と衝突するwith句はあなただと思います

于 2012-11-29T16:50:43.663 に答える