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>
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
@ user2864740 Ja, das habe ich gemeint. Ich habe den von Ihnen erwähnten Tippfehler korrigiert. Aber immer noch das gleiche Problem. – nam
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