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:

  1. Bin ich eine unmögliche Guss versucht oder ist dies auf jeden Fall ein Fehler in DbLinq?
  2. 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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top