2016-03-22 3 views
1

Ich habe einen Entity Framework 5-Modell mit 4 Tabellen und ich brauche eine LINQ-Abfrage für sie zu schaffen. Ich bin nicht in der Lage, die DB-Struktur zu ändern, da dies eine 3rd-Party-DB ist.Linq auf Objekte mit Navigationseigenschaft kommen - wie die Leistung zu verbessern

Meine aktuelle Abfrage ist:

_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(); 

Die problematische Zeile ist:

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

Wie kann ich die Leistung dieser Abfrage verbessern?

Gibt es eine Möglichkeit, wie die de.SiteType.Name vorzuladen? Ich denke, dass das Problem wahrscheinlich durch die Tatsache verursacht wird, dass es eine Abfrage zu SiteType-Tabelle für jede de Zeile erstellen muss, habe ich Recht?

+0

Überprüfen Sie den Typ von IsProject und stellen Sie sicher, dass es auf Boolean gesetzt ist. – jdweng

+0

IsProjects ist eine Eigenschaft der anonymen Objekte für den Vergleich und wie Sie sehen können - ja, es ist boolena –

+0

Sie haben den Code, der die Definition für IsProject zeigt nicht veröffentlicht. Alles, was Sie gepostet haben, war der Code, in dem Sie versuchen, einen Booleschen Wert für IsProject festzulegen, und es schlägt fehl. Es ist nicht anonym, es ist in der Klasse ProjectSiteNode() definiert. – jdweng

Antwort

0

Schließlich ich die Lösung gefunden habe !! Beeindruckend. Das Problem ist in ! = "Gelegenheit". Wenn ich ID statt String verwende, dauert es 0,2s anstelle von 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

Vielleicht hat es etwas mit dem Hinzufügen von Logik in der Join-Anweisung für EF4. Was passiert, wenn Sie versuchen:

_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

das würde nicht funktionieren, weil es nur Entitäten herausfiltern würde, die keine "Gelegenheit" sind, aber ich muss nur die richtigen Datensätze paaren - so Projekt zu Projekt, Gelegenheit zu Gelegenheit –

Verwandte Themen