Wie werfen Sie einen LinqToSql Table als Tabelle wo TEntity: IEntity?
-
26-09-2019 - |
Frage
Ich versuche DbLinq mit einer SQLite-Datenbank zu verwenden, aber ich laufe in ein Problem, wenn ich versuche, eine ITable
als Queryable<TEntity>
zu werfen.
Es ist ein bekannter Fehler in DbLinq ( Ausgabe 211 ), die die Quelle meines Problems könnte sein, aber ich wollte mein Code, um sicherzustellen, Ton und, wenn es etwas, wenn es herausfinden ist, könnte ich an der Arbeit, um den Fehler tun.
Hier ist die generische Repository-Methode, dass Versuche, die Besetzung zu tun:
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
Dies kompiliert, aber wenn ich pass in der Schnittstelle IPerson
für TEntity
und die Art der Einheiten in der Tabelle ist Person
(wo Person : IPerson
), erhalte ich diesen Fehler von DbLinq:
S0133. Implement QueryMethod Queryable.Cast
Warum versuche ich, dies zu tun?
ich ein Bibliotheksprojekt, das nicht die Art der Einheit bis zur Laufzeit nicht kennt, aber es funktioniert einfach die Schnittstelle für das Unternehmen. Also, ich versuche zu Cast auf den Interface-Typen, so dass meine Bibliothek Projekt die Daten verbrauchen kann.
Fragen:
- Bin ich eine unmögliche Guss versucht oder ist dies auf jeden Fall ein Fehler in DbLinq?
- Wie sonst könnte ich mein Problem zu lösen, gehen?
Aktualisieren
überarbeitete ich meine Repository-Klasse, so dass es jetzt eine TEntity
nimmt und ein TEntityBase
, wo TEntity
die tatsächliche Art des Unternehmens ist, und TEntityBase
ist die Schnittstelle, dass ich cast bin versucht. Wichtig ist, ich habe jetzt die folgende where
Klausel in meiner Klassendefinition:
where TEntity : class, TEntityBase
Dies ermöglicht es mir, meine Table
Eigenschaft als Table<TEntity>
speichern anstelle eines ITable
, die mich AsEnumerable()
verwenden können (als Stephen vorgeschlagen). Hier ist die überarbeitete Methode:
public IEnumerable<TEntityBase> GetAll()
{
return Table.AsEnumerable().Select(e => (TEntityBase)e);
}
Und so weit, dass scheint den Trick zu tun.
Lösung
Es klingt wie ein Bug, aber versteht, dass ein LINQ-Provider Implementierung ist ein absolut riesigen Unterfangen. Auch (Microsoft) LINQ to SQL und LINQ to Entities haben ihre eigenen Einschränkungen auf genau die LINQ-Abfragen / Operationen, die sie unterstützen oder nicht unterstützen.
Wenn IEnumerable<T>
Rückkehr akzeptabel ist, dann könnte man um den Mangel an Unterstützung für Queryable.Cast
arbeiten, indem sie AsEnumerable
Aufruf vor Cast
aufrufen. Allerdings schränkt dies, wie Sie Ihre DAL kann verwendet werden. Da IQueryable<T>
nicht mehr zurückgegeben, weitere Fragen (zum Beispiel Where
Klauseln) nicht bis in die DB-Schicht übergeben werden
Andere Tipps
Ich bin damit einverstanden es wie ein Fehler klingt. Sie könnten die folgende versuchen, die das gleiche tun
return Table.Select<TEntity>(tbl => (TEntity)tbl)
Sie können hinzufügen eine, wenn. ITable auf die Methodendefinition als auch