Die richtige Join/GroupJoin Umsetzung
Ich habe versucht, Sie arbeiten mit Join und GroupJoin-Methode. Das problem scheint einfach. Angesichts TableA
und TableB
wie datamaps so dass:
class MyDataContext : DataContext
{
public Table<tblA> TableA;
public Table<tblB> TableB;
}
...Ich bin mit TableA
als meine primäre Tabelle und wollen gemeinsam auf einem Feld, CustomerID
im TableB
abrufen [TableB].[LastName]
.
Sollte nicht schwer sein, außer, dass ich Schwierigkeiten haben, die Ergebnisse richtig zu arbeiten. TableA hat Aufzeichnungen, die ich will, unabhängig von einem übereinstimmenden CustomerID in TableB eingerichtet. Klingt wie ein left-join - also, Lesen hier, ich ahmte, was @tvanfosson vorgeschlagen:
//appropriately rewritten for my needs - so I thought...
private static IQueryable GetRecordsByView1(IQueryable<tblA> source)
{
var records = source.GroupJoin(myContext.TableB,
info => info.CustomerID,
owner => owner.CustomerID,
(info, owner) => new
{
info.CustomerID,
Owner = owner.Select(o => o.LastName).DefaultIfEmpty(),
Store = info.Store,
})
.Select(record => new
{
record.CustomerID,
record.Owner,
record.Store,
});
return records;
}
source
ist dynamisch, so dass eine Methode erstellt eine dynamische Abfrage:
public static void QueryStores()
{
IQueryable<tblA> source = myContext.TableA;
if (criteriaA)
source = source.Where(//something);
if (criteriaB)
source = source.Where(//something);
//after processing criteria logic, determine type of view
switch (byView)
{
case View1:
{
source = GetRecordsByView1(source);
break;
}
//other case blocks
}
myGridView.DataSource = source;
}
Das problem: ich erhalte den folgenden Fehler:
Konnte nicht format-Knoten 'OptionalValue'
für die Ausführung von SQL.
Ich glaube, es ist in der folgenden code-Zeile:
Owner = owner.Select(o => o.LastName).DefaultIfEmpty()
Was mache ich hier falsch? Ich habe das schreiben GroupJoin
als Erweiterung Methode.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig, dass
Owner = owner.Select(o => o.LastName).DefaultIfEmpty()
ist die Linie, die die Ursache Ihrer Probleme. Die beste Abhilfe, dass ich mit gekommen ist, so etwas wie dieses:Es ist sicherlich nicht ideal (Sie haben sich zu materialisieren der groupjoin mit "ToList"), und es könnte eine bessere Lösung sein, aber das hat für mich gearbeitet. Haben Sie vielleicht spielen Sie ein bisschen herum, um es zu arbeiten-genau das richtige für Sie, aber ich hoffe, dies hilft Ihnen auf Ihrem Weg.
DefaultIfEmpty()
, die Abfrage geht durch, aber der Besitzer Ergebnis leer. Ich trat in die Ergebnisse und die Eigentümer-Nachname ist, aber begraben. Also ich weiß, ich bin in der Nähe...danke.First...@Brian hab mich begann auf dem richtigen Weg. Hier ist die Lösung:
Diese bietet mir die genauen Ergebnisse gewünscht...
Check out this left-outer-join Beispiel: http://msdn.microsoft.com/en-us/library/bb397895.aspx
Den entsprechenden Proben:
Können Sie sich die Ergebnisse in gj, dann verwenden Sie DefaultIfEmpty zu erstellen, wird das outer-join-situation, und dennoch erhalten die Ergebnisse, die Sie wollen.
Jemand habe einen ähnlichen Fehler mit DefaultIfEmpty hier:
Max-oder Default?
http://blog.appelgren.org/2008/05/15/linq-to-sql-aggregates-and-empty-results/
HTH.
Join
als eine Erweiterung-Methode. Ich kann nicht schreiben, als LINQ-Anweisung.