У меня очень простая настройка. Таблица «Узел» имеет обнуляемый внешний ключ «ObjectId». Это представлено в моей модели базы данных с ассоциацией «один ко многим». Теперь я хочу выполнить запрос, который дает мне все Node-объекты с определенным идентификатором объекта. В прямом SQL это очень просто:
SELECT Node.*, Object.*
FROM Node INNER JOIN Object
ON Node.ObjectId = Object.ObjectId
WHERE Node.ObjectId = @objectId
Но теперь я хочу сделать то же самое в LINQ to SQL:
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();
...
Огорчает то, что LINQ всегда генерирует левое внешнее соединение для этого запроса, и ничто из того, что я пробовал, не имеет значения.
На первый взгляд, это имеет смысл. Внешний ключ ObjectId обнуляется, поэтому некоторые узлы не будут иметь связанный объект. Но в моем запросе я предоставляю идентификатор объекта. Меня не интересуют узлы без связанного объекта.
В этом случае ВНУТРЕННЕЕ СОЕДИНЕНИЕ - правильная вещь, но как мне убедить LINQ?