verwendetes Datenbanksystem: MS SQL Server 2005
Hallo,
ich möchte eine dynamische Tabellen-Abfrage mit Linq machen.
Der Tabellen-Name steht mir dabei nur als string zur Laufzeit zur Verfügung.
string mytabellenname = tbl_baum;
var items =
(
from s in ctx.tbl_baum select s
).ToList();
----------------------------
var items =
(
from s in ctx.[mytabellenname] select s
).ToList();
Wäre sehr nett, wenn mir dabei jemand weiterhelfen könnte.
ganz so trivial wie du dir das vorstellst wird das nicht
erstens brauchst du EntityKlassen, die sind "statisch", bzw müssten zur laufzeit über eine assembly eingeladen werden / oder genereriert werden.
Das Mapping kann dyamisch geladen werden...
die abfrage wie du es willst würde dann über Reflection laufen...
jedoch frag ich mich, welchen sinn LINQ dann macht? Da bist du mit nem alten SqlCommand (Text/SP) wesentlich schneller...
Denn Sinn verstehe ich auch nicht, wie willst du denn items gescheit auswerten, wenn dir zur Entwicklungszeit nicht bekannt ist, wie es aufgebaut ist?
Gruß David
Das das nicht einfach ist, bzw. sogar vielleicht gar nicht möglich, habe ich schon bemerkt 😉.
Deswegen wende ich mich ja an das Forum.
Ich habe das schon einmal mir der Reflection probiert, jedoch bekomme ich nur ein Objekt zurück und nicht den Typ den ich brauche. Man bekommt nur den Typ, wenn man den Typ kennt. Blöde Sache das.
In der Zwischenzeit habe ich noch das gefunden:
http://www.mycsharp.de/wbb2/thread.php?threadid=63203
Das trifft auch sehr gut mein Problem.
Ich wollte Linq verwenden, da ich vor habe sehr große Datenbanken zu exportieren und habe mir von Linq eine deutlich bessere Performance erhofft.
in dem thread steht doch schon deine antwort...
@DavidT: das stimmt so nicht, die ReturnTypes (var) sind zur entwicklungszeit bekannt. der variablen typ var ist Typesafe, ist nur "CodeSugger" für "mir doch egal was für ein datentyp, mach halt..."
damit ist auch dein Problem ad Adsurdum gefürt. Wenn du eine LINQ abfrage abschießt musst du vorher wissen was für einen datentyp du bekommt oder du arbeitest mit object...
codebeispiel...
object dataSource={Über reflection vom DataContext holen... zb DataSource.Entity1}
type datenTyp={genericType von dataSource auslesen}
object objecte=FROM t in dataSource
SELECT t
die geklammerten ausdrücke dürften durch code im 5-10zeiler bereich werden + diverse Try Catch Blöcke...
LINQ wurde gemacht um dir bei statischen Abfragen Support durch die Entwicklungsumgebung zu geben und alle vorzüge aus beiden welten (Einfache abfragesyntax, typesafe...)
für dynamische abfragen (im bezug auf die datenquelle) ist es einfach sinnfrei sowas zu benutzen...