2015-07-20 4 views
10

Sto usando Simple.Data ORM. Sto provando a fare una query da due tabelle unite. Questa query funziona bene:Simple.Data ORM. L'identificatore multiparte non può essere associato

dynamic alias; 
var candidatesRec = db.dbo.Candidates 
      .FindAll(db.dbo.Candidates.CommonOfferId == commonOfferId 
         && db.dbo.CandidateProfiles.CandidateId == null) 
      .LeftJoin(db.dbo.CandidateProfiles, out alias) 
      .On(db.dbo.Candidates.Id == alias.CandidateId) 
      .Select(
       db.dbo.Candidates.Id, 
       db.dbo.Candidates.Email 
      ) 
      .OrderByDescending(db.dbo.Candidates.ApplicationDate) 

Ma quando si aggiunge questa riga:

.Skip((pageNumber - 1) * pageSize) 

sto ottenendo questa eccezione:

I più parti identificatore \ "dbo.CandidateProfiles. CandidatoId \ "potrebbe essere non essere vincolato.

Ho cercato esplicitamente di passare 0, 1 e pochi altri numeri su Skip ma ottengo sempre la stessa eccezione.

La mia query di test dovrebbe restituire 4 elementi e sto saltando 0 elementi (può essere più nel normale utilizzo).

Ulteriori informazioni: CandidateProfiles ha chiave esterna da Candidates ed è CandidateId può essere nullo.

Modifica: Abbiamo risolto il problema, ma sono davvero curioso di sapere perché questo non funzionerà. Simple.Data sembrava divertente in un primo momento, ma ora non sono sicuro se userò in futuro

+1

Potrebbe includere uno script per la creazione delle tabelle così posso provare a replicare è localmente? Da un primo sguardo, sembra che si tratti di un bug all'interno della libreria, ma dovrei dare un'occhiata più da vicino all'SQL che sta generando (e com'è) – Rob

risposta

7

Ecco una spiegazione dell'errore di SQL da http://www.sql-server-helper.com/error-messages/msg-4104.aspx:

Un altro modo di ottenere l'errore è quando un alias è stato assegnato a una tabella a cui si fa riferimento nella clausola FROM di un'istruzione e la tabella è utilizzata come prefisso di una colonna anziché utilizzare l'alias.

Mentre questo non è esattamente ciò che accade nel tuo caso, è molto vicino. Il problema che vedo con il codice di esempio è nel FindAll chiamata:

 .FindAll(db.dbo.Candidates.CommonOfferId == commonOfferId 
        && db.dbo.CandidateProfiles.CandidateId == null) 
     .LeftJoin(db.dbo.CandidateProfiles, out alias) 

Dal momento che l'FindAll sta usando il nome completo "db.dbo.CandidateProfiles" ed ogni altro riferimento sta usando l'alias definito nel successivo LeftJoin, l'occorrenza nella clausola generata non utilizza l'alias e si finisce con un mix and match di alias e riferimenti tabella espliciti, che a SQL non piace.

Penso che il motivo per cui si è verificato solo nel tuo caso dopo l'aggiunta di "Salta", è che SQL molto diverso è stato generato (suppongo che solo dopo l'aggiunta di Skip sia stato effettivamente utilizzato un alias).

Non capisco lo scopo dei CandidateProfiles.CandidateId == null condition (perché combinato con la condizione nella chiamata On Non vedo come questo restituirebbe mai risultati), ma suggerirei di aggiungere restrizioni alla tabella unita nella chiamata On in modo che finisce nella clausola su al posto del quale clausola di (e quindi utilizzando l'alias anziché il nome completo)

.LeftJoin(db.dbo.CandidateProfiles, out alias) 
.On(db.dbo.Candidates.Id == alias.CandidateId && alias.CandidateId == null) 
Problemi correlati