Ecco il problema:Simulazione di join incrociati di contesto - LINQ/C#
Ho due contesti di dati su cui vorrei fare un join. Ora so che LINQ non consente l'accesso da un contesto a un altro, e so che 2 possibili soluzioni potrebbero essere creare un singolo datacontext o avere 2 query separate (che è ciò che sto facendo per ora). Comunque quello che vorrei fare è "simulare" un join.
Ecco cosa ho provato.
using (var _baseDataContext = Instance)
{
var query = from a in _baseDataContext.Account.ACCOUNTs
where a.STR_ACCOUNT_NUMBER.ToString() == accountID
join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals
app.GUID_ACCOUNT
join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION
select l.GUID_LOAN;
return query.Count() > 0 ? query.First() : Guid.Empty;
}
private static IQueryable<LOAN> GetLoans()
{
using (var _baseDataContext = Instance)
{
return (from l in _baseDataContext.Loan.LOANs
select l).AsQueryable();
}
}
In fase di esecuzione che ottenga è
System.InvalidOperationException: La query contiene riferimenti a oggetti definiti in un diverso contesto dati
EDIT:
soluzione di lavoro:
using (var _baseDataContext = Instance)
{
var query = from a in _baseDataContext.Account.ACCOUNTs
where a.STR_ACCOUNT_NUMBER.ToString() == accountID
join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals
app.GUID_ACCOUNT
join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION
select l.GUID_LOAN;
return (query.Count() > 0) ? query.First() : Guid.Empty;
}
private static IEnumerable<LOAN> GetLoans()
{
using (var _baseDataContext = Instance)
{
return (from l in _baseDataContext.Loan.LOANs
select l).AsQueryable();
}
}
Ho provato a restituire IEnumerable in precedenza, ma ho ricevuto un errore di trasmissione come previsto. Tuttavia non avevo pensato di restituire un IEnuerable AsQueryable. –
un potenziale problema con questo approccio è che non stai facendo un puro join, quindi se hai bisogno di aggiungere un altro join dal contesto del prestito non sarai in grado di vedere da quello che posso vedere. –
Okay ha funzionato. Siamo in grado di rimuovere la clausola where sul join del metodo e invece di eseguire una selezione dal metodo, è sufficiente eseguire un join puro.Il trucco qui è che il metodo deve restituire un oggetto IEnumerable. AsQueryable Ciò ci consente di eseguire join incrociati di contesto, e fino ad ora non vedo alcun risultato in termini di prestazioni. –