zu optimieren Ich freue mich auf meine LINQ-Abfrage zu optimieren, denn obwohl es richtig funktioniert, erzeugt das SQL es verworren und ineffizient ist ...Hilfe erforderlich ist, um LINQ-Abfrage
Grundsätzlich suche ich nach Kunden wählen (als CustomerDisplay Objekte), die das gewünschte Produkt (reqdProdId) bestellt und sind mit einer Kreditkartennummer (gespeichert als eine Zeile in RegisteredCustomer Tabelle mit einem Fremdschlüssel CustId)
var q = from cust in db.Customers
join regCust in db.RegisteredCustomers on cust.ID equals regCust.CustId
where cust.CustomerProducts.Any(co => co.ProductID == reqdProdId)
where regCust.CreditCardNumber != null && regCust.Authorized == true
select new CustomerDisplay
{
Id = cust.Id,
Name = cust.Person.DisplayName,
RegNumber = cust.RegNumber
};
als Überblick registriert, hat ein Kunde eine entsprechende Person der hat den Namen; PersonID ist ein Fremdschlüssel in Customer-Tabelle. Wenn ich das generierte SQL ansehe, sehe ich, dass alle Spalten aus der Tabelle Person ausgewählt werden. Fyi, DisplayName ist eine Erweiterungsmethode, die Customer.FirstName und LastName verwendet. Irgendwelche Ideen, wie ich die Spalten von Person begrenzen kann?
Zweitens möchte ich die Any-Klausel loswerden (und eine Unterabfrage verwenden), um alle anderen CustomerIds auszuwählen, die die erforderliche ProductID haben, weil sie (verständlicherweise) eine Exists-Klausel generiert. Wie Sie vielleicht wissen, hat LINQ ein bekanntes Problem mit Junction-Tabellen, so dass ich nicht einfach ein cust.CustomerProducts.Products ausführen kann. Wie kann ich alle Kunden in der Junction-Tabelle mit der erforderlichen ProductID auswählen?
Jede Hilfe/Beratung wird geschätzt.
Thansk Lame Duck, dachte nie an kompilierte LINQ ... wird hineinschauen. Das ist ein paar nette funktionale Programmier-Sachen. Auch ich einen Fremdschlüssel zwischen dem Kunden haben und RegisteredCustomer, und ich bin nicht sicher, ob es einen Unterschied zwischen ist custProd.Customer.RegisteredCustomer.CreditCardNumber! = Null (wie Sie vorschlagen) und custProd.CreditCardNumber! = null (wie ich hatte) LINQ die custProd findet heraus ist die Zeile in der Verknüpfung und der SQL erzeugt war INNER JOIN RegisteredCustomer als t2 auf t1.Id = t2.CustomerID ... ... t2 .CreditCardNumber ist NICHT NULL –
Erneutes Kompilieren der Abfrage: Die Abfrage wird zur Laufzeit noch kompiliert, nicht zur Kompilierzeit. Dies hilft nur, wenn Sie dieselbe Abfrage mehrmals verwenden, da Sie die kompilierte Abfrage zwischenspeichern und wiederverwenden können. – Lucas