2013-04-12 17 views
5

Sto tentando di outer join una tabella con una funzione con valori di tabella in linea nella mia query LINQ, ma ottengo un errore di compilazione di query in fase di esecuzione stimato:Entity Framework 5: come Outer Join Tabella delle funzioni

" La query ha tentato di chiamare "OuterApply" su una query nidificata, ma "OuterApply" non aveva le chiavi appropriate. "

La mia dichiarazione LINQ si presenta così:

 var testQuery = (from accountBase in ViewContext.AccountBases 

         join advisorConcatRaw in ViewContext.UFN_AccountAdvisorsConcatenated_Get() 
           on accountBase.AccountId equals advisorConcatRaw.AccountId into advisorConcatOuter 
         from advisorConcat in advisorConcatOuter.DefaultIfEmpty() 

         select new 
         { 
          accountBase.AccountId, 
          advisorConcat.Advisors 
         }).ToList(); 

La definizione di funzione è la seguente:

CREATE FUNCTION dbo.UFN_AccountAdvisorsConcatenated_Get() 
RETURNS TABLE 
AS 
RETURN 
    SELECT AP.AccountId, 
      LEFT(AP.Advisors, LEN(AP.Advisors) - 1) AS Advisors 
     FROM ( SELECT DISTINCT 
         AP.AccountId, 
         ( SELECT AP2.PropertyValue + ', ' 
          FROM dbo.AccountProperty AP2 WITH (NOLOCK) 
          WHERE AP2.AccountId = AP.AccountId 
          AND  AP2.AccountPropertyTypeId = 1 -- Advisor 
          FOR XML PATH('')) AS Advisors 
       FROM dbo.AccountProperty AP WITH (NOLOCK)) AP; 

posso eseguire correttamente il join direttamente in SQL come segue:

SELECT ab.accountid, 
     advisorConcat.Advisors 
FROM accountbase ab 
     LEFT OUTER JOIN dbo.Ufn_accountadvisorsconcatenated_get() advisorConcat 
        ON ab.accountid = advisorConcat.accountid 

Qualcuno ha un esempio di lavoro di sinistra esterno che unisce un inline TVF a un tavolo in LINQ alle entità - o si tratta di un difetto noto, ecc.? Grazie molto.

+0

Hanno lo stesso problema, qualche soluzione? –

+0

Ancora nessuna risposta su questo da Microsoft - questo problema verrà risolto nella prossima versione di EF? –

risposta

1

Entity Framework deve sapere quali sono le colonne chiave principali dei risultati TVF per eseguire un join sinistro. Fondamentalmente è necessario creare una tabella falsa che abbia lo stesso schema dei risultati TVF e aggiornare TVF nel browser modello per restituire il nuovo tipo di tabella creato anziché il tipo complesso predefinito. Potresti fare riferimento a this answer per ottenere maggiori dettagli.