Disclaimer The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.
Ich habe folgendes Datenmodell mit dem LINQ To SQL Designer aufgebaut:
So, eigentlich ganz einfach. Mit folgendem Code kann ich die Daten einlesen:
var formList = from f in listDataContext.cFormListItems orderby f.FormShort select f;
var countryList = from c in listDataContext.cCountryListItems orderby c.CountryName select c;
Damit liest LINQ die Daten für die Forms bzw. die Countries ein, die zugeordneten Tabellen bleiben leer, bis man auf das entsprechende Element zugreift, dann wird das nachgeladen (lazy loading). Dieser Effekt ist super, wenn ich z.B. eine Liste der Kunden habe und den Kunden Bestellungen zugeordnet sind und ich teilweise Kunden mit mehreren tausend Bestellungen habe. Dann will ich die Bestellungen nicht gleich alle mitladen. Aber in meinem Fall war es so, dass in den verknüpften Tabellen nur wenige Datensätze stehen und ich deshalb lieber alles auf einen Rutsch laden wollte. Das geht dann so:
listDataContext = new cListDataContext("Data Source=NOTEBOOK_VISTA;Initial Catalog=ValuePlanner_2008;Integrated Security=True"); // Define LoadOptions to load some related tables with their parent tables in one select statement DataLoadOptions loadOptions = new DataLoadOptions(); loadOptions.LoadWith<cFormListItem>(f => f.FormType); loadOptions.LoadWith<cCountryListItem>(c => c.Market); listDataContext.LoadOptions = loadOptions;
Diesen Code muss man vor der ersten Abfrage ausführen. Hier werden zwei LoadWith (jeweils für eine untergeordnete Tabelle) mit angegeben. Dies bewirkt, dass die untergeordneten Tabellen mit der jeweiligen Haupttabelle in einem einzigen SELECT Statement aus der Datenbank geladen werden! Ein paar Sachen muss man allerdings beachten:
Ich hätte das zwar schöner gefunden, wenn man das auch mit im Designer einstellen könnte, aber es funktioniert einwandfrei.
Hier noch als Beweis das SQL-Statement, das dann tatsächlich auf der Datenbank ausgeführt wird:
SELECT [t0].[ID], [t0].[FormLong], [t0].[FormShort], [t0].[FormTypeID], [t1].[ID] AS [ID2], [t1].[FormTypeLong], [t1].[FormTypeShort] FROM [values_Forms] AS [t0] INNER JOIN [values_FormTypes] AS [t1] ON [t1].[ID] = [t0].[FormTypeID] ORDER BY [t0].[FormShort]
Remember Me