LLBL Linq переменное количество соединений

Я использую синтаксис Linq для LLBL. У меня есть необходимость присоединиться к определенной таблице разное количество раз. У меня есть запрос, который работает, но я пытаюсь сделать это быстрее. У меня есть сырой SQL, но я не уверен, как его кодировать в Linq или даже могу. Вот упрощенный пример:

SELECT Parent.SomeColumn
FROM
    ParentTable Parent
    INNER JOIN ChildTable Child1 ON Child1.ParentID = Parent.ID
    INNER JOIN ChildTable Child2 ON Child2.ParentID = Parent.ID
WHERE
    Child1.TypeColumn = 'Type1'
    AND Child2.TypeColumn = 'Type2'

Это достаточно просто сделать, но я хочу что-то, что будет обрабатывать Child3, Child4 и т. Д. Другими словами, я не буду знать количество соединений ChildTable во время компиляции.

Мой исходный код запрашивал ParentTable, а затем выполнял подзапросы EXISTS для ChildTable каждый раз, когда мне требовалось объединение. Это работает, но я вижу, что выполнение запроса выше займет около 1/4 времени. У меня есть некоторые обновления пользовательского интерфейса в реальном времени, которые увидят значительное улучшение, если я смогу сделать эту работу.

Я знаю, что было бы очень легко, если бы я строил SQL-запрос в коде, но я действительно хотел бы положиться на LLBL, чтобы сгенерировать это для меня.

1 ответ

Я не знаю конкретно о LLBL, но в EF или LINQ to SQL я был бы очень удивлен, если бы следующее не приводило к чему-то очень похожему на необработанный SQL-запрос, который вы разместили:

int numJoins = ...
IQueryable<ParentTable> parents = ...

for (var i = 0; i < numJoins; i++) {
    var typeI = "Type" + (i + 1);
    var typeIChildren = children.Where(ch => ch.TypeColumn == typeI);
    parents = parents.Join(typeIchildren, parent => parent.Id, child => child.ParentId, (parent, child) => parent);
}

return parents.Select(p => p.SomeColumn);
Другие вопросы по тегам