Wie kann ich LINQ to SQL zwingen, einen INNER JOIN für einen nullfähigen Fremdschlüssel auszuführen?
Ich habe eine sehr einfache Einrichtung. Die Tabelle "Node" hat einen nullbaren Fremdschlüssel "ObjectId". Dies ist in meinem Datenbankmodell mit einer Eins-zu-Viele-Zuordnung dargestellt. Jetzt möchte ich eine Abfrage ausführen, die mir alle Knotenobjekte mit einer bestimmten Objekt-ID gibt. In direktem SQL ist dies sehr einfach:
SELECT Node.*, Object.*
FROM Node INNER JOIN Object
ON Node.ObjectId = Object.ObjectId
WHERE Node.ObjectId = @objectId
Aber jetzt möchte ich dasselbe in LINQ to SQL tun:
private static Func<MyDataContext, string, IQueryable<DataNode>> _queryGet =
CompiledQuery.Compile(
(MyDataContext context, string objectId) =>
(from node in context.DataNodes
where node.ObjectId == objectId
select node));
var loadOptions = new DataLoadOptions();
loadOptions.LoadWith<DataNode>(node => node.DataObject);
context.LoadOptions = loadOptions;
DataNode node = _queryGet.Invoke(context, objectId).FirstOrDefault();
...
Das Frustrierende ist, dass LINQimme generiert einen LEFT OUTER JOIN für diese Abfrage und nichts, was ich ausprobiert habe, macht einen Unterschied.
uf den ersten Blick scheint dies einen Sinn zu ergeben. Der ObjectId-Fremdschlüssel ist nullwertfähig, sodass einigen Knoten kein Objekt zugeordnet ist. In meiner Abfrage gebe ich jedoch eine Objekt-ID an. Ich interessiere mich nicht für Knoten ohne zugehöriges Objekt.
In diesem Fall ist ein INNER JOIN das Richtige, aber wie kann ich LINQ überzeugen?