2016-03-22 3 views
1

У меня есть модель Entity Framework 5 с 4 таблицами, и мне нужно создать запрос LINQ против них. Я не могу изменить структуру БД, поскольку это сторонний БД.Linq присоединиться к объектам с навигационным свойством - как повысить производительность

Мой текущий запрос:

_projectSites = (from de in _data.DataExchange 
    join m in _data.Projects_MACO //combine exchange data and maco data 
    on new 
    { 
     Number = de.number, 
     IsProject = de.SiteType.Name != "opportunity" 
    } equals 
    new 
    { 
     Number = m.ProjectNumber == null ? m.OppNumber : m.ProjectNumber, 
     IsProject = m.ProjectNumber != null 
    } 
    join d in _data.DataStores //and select only sites with datastores 
    on new 
    { 
     Number = de.number 
    } equals 
    new 
    { 
     Number = d.SiteNumber 
    } 
    where de.Server.Name == _server 
    select new ProjectSiteNode() 
    { 
     Server = de.Server.Name, 
     ProjectNumber = de.number, 
     Manager = m.ProjectNumber == null ? m.OMInitials : m.PMInitials, 
     Exists = true, 
     IsConfidential = de.confidential, 
     Name = m.ProjectNumber == null ? m.OppTitle : m.ProjectTitle, 
     ProjectType = de.SiteType.Name,// m.ProjectNumber == null ? "opportunity" : "project", 
     Status = de.SiteState.Name 
    }).Distinct().ToList(); 

Проблематика линия:

IsProject = de.SiteType.Name != "opportunity" 

Как я могу улучшить производительность этого запроса?

Есть ли какой-нибудь шанс предварительно загрузить файл de.SiteType.Name? Я думаю, что проблема, вероятно, связана с тем, что он должен создать запрос к таблице SiteType для каждой строки de, правильно?

+0

Проверьте тип IsProject и убедитесь, что он установлен на Boolean. – jdweng

+0

IsProjects является свойством анонимных объектов, используемых для сравнения, и, как вы можете, да, это boolena –

+0

Вы не разместили код, который показывает определение для IsProject. Все, что вы разместили, это код, в котором вы пытаетесь установить логическое значение в IsProject, и он не работает. Он не является анонимным, он определен в классе ProjectSiteNode(). – jdweng

ответ

0

Наконец я нашел решение !! Вау. Проблема в ! = "Возможность". Если я использовал идентификатор вместо строки, он принимает 0.2s вместо 28s

var projectSites = (from d in _data.DataStores 
            join de in _data.DataExchange 
            on new 
            { 
             Number = d.SiteNumber 
            } equals 
            new 
            { 
             Number = de.number 
            } 
            join m in _data.Projects_MACO //combine exchange data and maco data 
            on new 
            { 
             Number = de.number, 
             IsProject = de.SiteType.ID != 2 
            } equals 
            new 
            { 
             Number = m.ProjectNumber == null ? m.OppNumber : m.ProjectNumber, 
             IsProject = m.ProjectNumber != null 
            } 

            where de.Server.Name == _server 
            select new 
            { 
             Server = de.Server.Name, 
             ProjectNumber = de.number, 
             Manager = m.ProjectNumber == null ? m.OMInitials : m.PMInitials, 
             Exists = true, 
             IsConfidential = de.confidential, 
             Name = m.ProjectNumber == null ? m.OppTitle : m.ProjectTitle, 
             ProjectType = de.SiteType.Name,// m.ProjectNumber == null ? "opportunity" : "project", 
             Status = de.SiteState.Name 
            }).Distinct().ToList(); 
0

Возможно, у него есть что-то с добавлением логики внутри инструкции-соединения для EF4. Что произойдет, если вы попробуете:

_projectSites = (from de in _data.DataExchange 
    join m in _data.Projects_MACO //combine exchange data and maco data 
    on new 
    { 
     Number = de.number 
    } equals 
    new 
    { 
     Number = m.ProjectNumber == null ? m.OppNumber : m.ProjectNumber 
    } 
    join d in _data.DataStores //and select only sites with datastores 
    on new 
    { 
     Number = de.number 
    } equals 
    new 
    { 
     Number = d.SiteNumber 
    } 
    where de.Server.Name == _server 
    && de.SiteType.Name != "opportunity" 
    && m.ProjectNumber != null 
    select new ProjectSiteNode() 
    { 
     Server = de.Server.Name, 
     ProjectNumber = de.number, 
     Manager = m.ProjectNumber == null ? m.OMInitials : m.PMInitials, 
     Exists = true, 
     IsConfidential = de.confidential, 
     Name = m.ProjectNumber == null ? m.OppTitle : m.ProjectTitle, 
     ProjectType = de.SiteType.Name,// m.ProjectNumber == null ? "opportunity" : "project", 
     Status = de.SiteState.Name 
    }).Distinct().ToList(); 
+0

это не сработает, потому что он будет отфильтровывать только объекты, которые не являются «возможностью», однако мне нужно только соединить правильные записи - так что проект для проекта, возможность возможности –

Смежные вопросы