Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Dynamische LINQ Source
SaberRider
myCSharp.de - Member

Avatar #avatar-2260.gif


Dabei seit:
Beiträge: 115
Herkunft: Mannheim

Themenstarter:

Dynamische LINQ Source

beantworten | zitieren | melden

verwendetes Datenbanksystem: MSSQL 2005 Standard V 9.00.3050.00

Hallo zusammen,

nach langer Zeit hab komm ich mal wieder zum Coden und bin direkt in ein, für mich, verzwicktes Problem gerannt.

Ich möchte per Linq (.net 4.0) eine dynamische Abfrage auf unterschiedliche Tabellen machen und dann entsprechendes Ergebnis vom Typ der Tabelle bekommen. Die Where-Klausel ist (hier nicht aufgezeigt) bei allen Tabellen identisch.

Auf diese Art in etwa


var resultset = from b in sutekhDB.<<TableName>>
select b;
wobei <<TableName>> der Name der Tabelle und das Ergebnis eben von Typ <<TabelName>>
sein soll.

Nachfolgendes funktioniert natürlich leider nicht, da b seinen Typ nicht kennt.


Assembly execAsm = Assembly.GetExecutingAssembly();

Type myType = (from type in execAsm.GetTypes()
where type.Name.ToLower().Equals(TableName.ToLower())
select type).FirstOrDefault();

var v = from b in myType
select b;

DataContext.GetTable hab ich auch schon versucht, bin aber zu keinem funktionierenden Ergebnis gekommen.

Ich hoffe ich hab mein Vorhaben einigermaßen beschrieben. Leider bin ich mit Linq noch lange nicht so weit ich das gerne hätte.

Dankbar wäre ich um Hinweise, Schlagworte oder sonstiges, welche mich bei einer Lösungsfindung weiterbingen könnten.
Was habe ich übersehen?
Oder befinde ich mich komplett auf dem Holzweg und mein Vorhaben kann mit Linq nicht realisiert werden?

Google, etc. kann ich grad nicht mehr sehen ;)


Auf jeden Fall schon einmal vielen lieben Dank für die Hilfe.

Beste Grüße,
SaberRider
8) - Lieber Fürst in der Hölle als Sklave im Himmel - 8)
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Hallo SaberRider,

du könntest alle deine benötigten Klassen von einem Interface erben lassen, welche die Name Eigenschaft besitzt und dann folgendes machen:


public Interface IMyInterface
{
    string Name { get;}
}

public static Expression<Func<T,bool>> CustomFilter<T>(string name) where T : IMyInterface
{
    return i => i.Name.Equals(name);
}
Dann kannst du den Aufruf wie folgt erreichen.


var result = context.TableNameWelcheIMyInterfaceImplementiert.Where(CustomFilter("hallo"));

Benutze EF, deswegen kann es in Linq vielleicht anders sein.

Gruß,
Michael
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
SaberRider
myCSharp.de - Member

Avatar #avatar-2260.gif


Dabei seit:
Beiträge: 115
Herkunft: Mannheim

Themenstarter:

beantworten | zitieren | melden

Hola Michael,

danke für deine fixe Antwort. Bin leider erst jetzt zu gekommen, mir sie anzuschauen, da es mich bei bestem Wetter krankheitstechnisch erwischt hat.

Zwei Fragen hätte ich zu deiner Antwort:

Zu Anfang eine vllt. blöde... Aber können Klassen von Interfaces erben? Soweit ich weiß nicht. Oder meinst du eine abstrakte Klasse? Bzw. du meinst die Klasse ein Interface implementieren zu lassen, oder? Bitte bitte nicht falsch verstehen, ich mag nur ein eventuelles Missverständnis vermeiden.

Wenn ich alle meine notwendigen Klasse modifizieren, dann ists doch nicht mehr komplett dynamisch. Genau so einen manuellen Eingriff will ich ja vermeiden.


Es muss nicht zwingend Linq sein. Bin für alles andere offen :)


Ich versuch mal, ob ich ein besseres Beispiel erstellen kann.


Grüße und Danke,
Gøran
8) - Lieber Fürst in der Hölle als Sklave im Himmel - 8)
private Nachricht | Beiträge des Benutzers
deerhunter
myCSharp.de - Member



Dabei seit:
Beiträge: 92

beantworten | zitieren | melden

Du hast Recht, wenn du sagst, dass eine Klasse nicht von einem Interface erben kann. Sie kann dies nur implementieren. Da die Schreibweise im Quellcode jedoch identisch ist, sagen manche dies einfach so.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16108

beantworten | zitieren | melden

Solang die verschiedenen Typen nicht von einer gemeinsamen Basis (oder Interface) stammen, ist dies mit Linq nicht möglich.
xxMUROxx's Lösung ist die sinnvollste.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
SaberRider
myCSharp.de - Member

Avatar #avatar-2260.gif


Dabei seit:
Beiträge: 115
Herkunft: Mannheim

Themenstarter:

beantworten | zitieren | melden

OK, danke für die Antworten :)

Dann überleg ich mir mal, ob ich das Interface so einbinde, bzw. ob das in meinem Fall dann noch so passt wie es gedacht war.

:O
8) - Lieber Fürst in der Hölle als Sklave im Himmel - 8)
private Nachricht | Beiträge des Benutzers