2016-09-08 4 views
1

In meinen folgenden Beispieldatentabellen hat der Kunde C1 Gemüse bestellt und C2 Obst bestellt. Ich möchte den Namen der potentiellen Kunden C3 und C4 anzeigen, die noch keine Bestellungen haben. Also benutze ich eine Outer Join, aber Abfrage liefert immer die erste cutomer C1. Es scheint, etwas stimmt nicht mit meiner Where-Klausel.LINQ OUTER JOIN Abfrage - Null in Where-Klausel funktioniert nicht

Tabelle Customers:

CustomerID CustName 
1   C1 
2   C2 
3   C3 
4   C4 

Tabelle Orders:

OrderID CustomerID OrderType 
1  1   V 
2  2   F 
3  1   V 

LINQ Abfrage ohne Aufträge potenziellen Kunden noch angezeigt werden:

public class TestDbController : Controller 
    { 

     public async Task<IActionResult> TestAction(List<CustomersViewModel> list) 
     { 
      var Qry = from c in Customers 
        join ord in Orders on c.CustomerId equals ord.CustomerId into c_o 
        from t in c_o.DefaultIfEmpty() 
        where t == null 
        select new CustomersViewModel() {CustName = c.Name}; 
      return View(qry.ToList()); 
     } 
    } 

UPDATE:

Laut @ IvanStoev scheint dies ein EF-Kern-Bug zu sein. Ich hätte darauf hingewiesen, dass ich die folgenden Technologien verwende: ASP.NET CORE, EF Core, Visual Studio 2015 - UPDATE 3 und SQL Server Express 2014. Ich habe ein Tag für EF Core in den Post eingefügt.

Wenn jemand eine Lösung oder einen Workaround finden kann, lassen Sie es mich bitte wissen.

UPDATE 2:

SQL Server Profiler erfasst die folgenden folgenden SQL:

exec sp_executesql N'SELECT [c].[CustNumber], @__Empty_0 
FROM [Customers] AS [c] 
LEFT JOIN [Orders] AS [ord] ON [c].[CustomerID] = [ord].[CustomerID] 
ORDER BY [c].[CustomerID]',N'@__Empty_0 nvarchar(4000)',@__Empty_0=N'' 

Aber meiner Meinung nach ist nur ein Datensatz zeigt. Auch, wenn ich einen Haltepunkt an @for (int t=0; t<Model.Count; t++) meiner Ansicht nach unten legen, es zeigt nur 1 am Model.Count:

@model List<MyProject.Models.MyViewModels.CustomersViewModel> 

    <form asp-controller="TestDb" asp-action="TestAction" method="post"> 
    <table class="table"> 
     <thead> 
     <tr> 
      <th><label asp-for="@Model.First().CustName"></label></th> 
     </tr> 
     </thead> 
     <tbody> 
      @for (int t=0; t<Model.Count; t++) 
       { 
        <tr> 
        <td><input type="hidden" asp-for="@Model[t].CustomerId"/ </td> 
        <td><input type="text" asp-for="@Model[t].CustName"/></td> 
        </tr> 
       } 
     </tbody> 
     </table> 
     <button type="submit">Save</button> 
    </form> 
+0

Sollte sein 'wo t == null' zu finden Zeilen in c ohne (dh leer rechten Seite des linken verbinden.). Dies unterscheidet sich von normalem SQL, wo eine bestimmte Spalte/Wert auf Null überprüft wird. Siehe http://stackoverflow.com/a/3413732/2864740 als einfache Referenz. – user2864740

+0

@ user2864740 Ja, das habe ich gemeint. Ich habe den von Ihnen erwähnten Tippfehler korrigiert. Aber immer noch das gleiche Problem. – nam

+1

Mein nächster Schritt beim Debugging wäre, das resultierende SQL zu untersuchen. (Dies ist super einfach/nicht intrusiv mit SQL Server und einer angehängten SQL Profiler-Sitzung.) – user2864740

Antwort

0

Dies ist eigentlich Ihre Abfrage und Werke (gegen sagen Nordwind):

var Qry = from c in Customers 
       join ord in Orders on c.CustomerID equals ord.CustomerID into c_o 
       from t in c_o.DefaultIfEmpty() 
       where t == null 
       select c; 

aber simplier Weg, das zu sagen ist:

var Qry = from c in Customers 
      where !c.Orders.Any() 
      select c; 
+0

Die OP meldet die Abfrage funktioniert nicht wie gewünscht - die einzige scheinbare Änderung scheint die Select-Klausel zu sein:} – user2864740

+0

Und ich sage, es funktioniert wie gewünscht, was ist "nicht erwünscht"? –

+1

Das OP meldet, dass es die fehlenden Zeilen nicht zurückgibt, sondern eine einzelne Zeile eines erfolgreichen Joins ("..aber die Abfrage gibt immer den ersten Kunden C1 zurück"). Während ich diesen Ergebnissen skeptisch gegenüberstehe und ich vermute, dass etwas anderes nicht stimmt, ist es das gemeldete Verhalten. – user2864740