Immaginate la seguente struttura della tabellaLINQ Unione multipla IQueryable modificare l'espressione del selettore di risultato
---------
TableA
ID
Name
---------
TableB
ID
TableAID
---------
TableC
ID
TableBID
voglio definire una funzione che unisce questi tre tavoli e accetta un Expression<Func<TableA, TableB, TableC, T>>
come selettore.
Così mi piacerebbe qualcosa di simile al seguente:
public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
return from a in DbContext.Set<TableA>()
join b on DbContext.Set<TableB>() a.ID equals b.TableAID
join c on DbContext.Set<TableC>() b.ID equals c.TableBID
select selector;
}
Ora, ovviamente quanto sopra non faccio quello che voglio fare, questo mi darà una IQueryable
del tipo di espressione. Potrei usare la sintassi del metodo di concatenazione, ma alla fine ho bisogno di più selettori, uno per ogni chiamata alla catena del metodo. C'è un modo per prendere il selettore e applicarlo a un tipo anonimo, come nella seguente funzione incompleta:
public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
var query = from a in DbContext.Set<TableA>()
join b on DbContext.Set<TableB>() a.ID equals b.TableAID
join c on DbContext.Set<TableC>() b.ID equals c.TableBID
select new
{
A = a, B = b, C = c
};
// I need the input selector to be modified to be able to operate on
// the above anonymous type
var resultSelector = ModifyInputSelectorToOperatorOnAnonymousType(selector);
return query.Select(resultSelector);
}
Delle idee su come questo potrebbe essere fatto?
Il metodo viene chiamato da diversi punti e deve essere in grado di eseguire la selezione sul database. Non credo che la soluzione fornita verrà eseguita sul database, potrebbe effettivamente ottenere una TargetInvocationException – mhand
I stand corretti, EF consente di utilizzare tipi non mappati negli alberi di espressioni IQueryable. – mhand
Sì, finché l'albero delle espressioni risultante può essere convertito in SQL, va tutto bene. – Ocelot20