Domanda

Sto cercando di utilizzare DbLinq con un database SQLite, ma sto correndo in un problema quando provo a lanciare un ITable come Queryable<TEntity>.

C'è un bug noto in DbLinq ( Problema 211 ), che potrebbe essere la fonte del mio problema, ma ho voluto assicurarsi che il mio codice è il suono e, se lo è, scoprire se ci potrebbe essere qualcosa che posso fare per aggirare il bug.

Ecco il metodo repository generico che i tentativi di fare il cast:

public IQueryable<TEntity> GetAll()
{
    return Table.Cast<TEntity>(); // Table is an ITable
}

Questa compilazione, ma se mi passa nella IPerson interfaccia per TEntity e il tipo di entità nella tabella è Person (dove Person : IPerson), sto ottenendo questo errore da DbLinq:

  

S0133:. Implementare QueryMethod Queryable.Cast

Perché sto cercando di fare questo?

Ho un progetto di libreria che non conosce il tipo di entità fino al runtime, ma lo fa sapere l'interfaccia per l'entità. Quindi, sto cercando di fusione per il tipo di interfaccia in modo che il mio progetto di libreria può consumare i dati.

Domande:

  1. I Am tentando un cast impossibile o è questo sicuramente un bug in DbLinq?
  2. In quale altro modo posso fare per risolvere il mio problema?

Aggiorna

ho rielaborato la mia classe repository in modo che la società vuole un TEntity e un TEntityBase, dove TEntity è il tipo effettivo del soggetto, e TEntityBase è l'interfaccia che sto cercando di cast. È importante sottolineare che, ora ho la seguente clausola where nella mia definizione di classe:

where TEntity : class, TEntityBase

Questo mi permette di conservare la mia proprietà Table come Table<TEntity> invece di un ITable, che mi permette di usare AsEnumerable() (come suggerito Stephen). Ecco il metodo rivisto:

public IEnumerable<TEntityBase> GetAll()
{
    return Table.AsEnumerable().Select(e => (TEntityBase)e);
}

E finora, che sembra per fare il trucco.

È stato utile?

Soluzione

Sembra un bug, ma capire che l'attuazione di un fornitore di LINQ è uno sforzo assolutamente enorme. Anche LINQ (di Microsoft) per SQL e LINQ to Entities hanno le proprie restrizioni esattamente quali query LINQ / operazioni che supportano o non supportano.

Se il ritorno IEnumerable<T> è accettabile, allora si potrebbe aggirare la mancanza di supporto per Queryable.Cast chiamando AsEnumerable prima di chiamare Cast. Tuttavia, questo restringe come il vostro DAL può essere utilizzato:. Dal IQueryable<T> non è più tornato, eventuali domande (per esempio, le clausole Where) non verranno passati attraverso lo strato di DB

Altri suggerimenti

Sono d'accordo che suona come un insetto. Si potrebbe provare quanto segue, che farà la stessa cosa

return Table.Select<TEntity>(tbl => (TEntity)tbl)

Potrebbe essere necessario aggiungere un dove:. ITable alla definizione del metodo e

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top