2017-07-27 4 views
0

Ich versuche eine Linq-Abfrage zu schreiben, die Datensätze aus mehreren SQL-Tabellen sammelt. Die Tabellen und ihre Beziehungen sind im Bild unten angegeben. Beziehungen, die bereits durch Primär- und Fremdschlüssel in den Tabellen hergestellt wurden, sind mit schwarzen Linien gekennzeichnet. Rote Linien kennzeichnen Beziehungen, die nur für die Abfrage benötigt werden, um Datensätze auf die benötigten zu beschränken. Wie eine Tabelle mit zwei anderen Tabellen mit Linq in einer komplexen Abfrage zu verbinden?

Hier ist mein beste Versuch für die linq Abfrage, die jedoch mehr Datensätze gibt, wie ich erwartet habe (Kombinationen von nicht verwandten Datensätzen). ‚Analysiert‘ auf ‚Samples‘ und zu ‚Allowances‘

  var query = from wastewater in db.WasteWaters 
        join allowance in db.Allowances on wasterwater.WasteWaterId equals allowance.WasteWaterId 
        join chemical in db.Chemicals on allowance.ChemicalId equals chemical.ChemicalId 
        join sample in db.Samples on wastewater.WasteWaterId equals sample.WasteWaterId 
        join analysissample in db.Analyses on sample.SampleId equals analysissample.SampleId 
        join analysisallowance in db.Analyses on allowance.ChemicalId equals analysisallowance.ChemicalId 

        select new QueryModel 
        { 
         WasteWaterName = wastewater.WasteWaterName, 
         SampleDescription = sample.SampleDescription, 
         Chemical = chemical.ChemicalName, 
         Result = analysis.AnalysisResult, 
         MaxAllowed = allowance.MaxAllowance 
        }; 
     return query; 

Ich glaube, der entscheidende Punkt in der Tabelle beitritt.

Wenn ich meine Datenbank mit SQL abfragen (was ich sicher tun werde), dann unterscheidet sich das Ergebnis vom Linq-Abfrageergebnis. Also muss etwas mit meiner linq-Abfrage nicht stimmen. Unterhalb der entsprechenden sql:

SELECT WasteWaters.WastewaterName, Samples.SmplDescription, Chemicals.ChemicalName, Allowances.MaxAllowance, Analyses.Result 
FROM ((Chemicals INNER JOIN (WasteWaters INNER JOIN Allowances ON WasteWaters.WasteWaterId = Allowances.WasteWaterId) 
ON Chemicals.ChemicalId = Allowances.ChemicalId) INNER JOIN Samples ON WasteWaters.WasteWaterId = Samples.WasteWaterId) 
INNER JOIN Analyses ON (Analyses.ChemicalId = Allowances.ChemicalId) AND (Samples.SampleId = Analyses.SampleId); 

Jede Hilfe mit diesem Problem wäre willkommen.

+1

Ich würde nicht Linq zu SQL verwenden, da es ziemlich tot ist. Ich würde Entity Framework verwenden, wenn möglich. Dann können Sie die Tabellen navigieren und automatisch aus einer Vorlage erstellen. Ich bin mir nicht sicher, aber Linq zu Sql kann die Navigationselemente haben, da ich weiß, dass es einige Dinge gibt, die EF hat. Wo könnten Sie etwas Ähnliches wie YourObject.Include ("ChildObject.ChildChildObject") tun. Wählen Sie (x => new {(kombinierte Eigenschaften)}); Vielleicht nicht möglich, nur ein Vorschlag. https://msdn.microsoft.com/en-us/library/jj574232%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396 – djangojazz

Antwort

1

Funktioniert das für Sie?

var ans = from c in Chemicals 
      join a in Allowances on c.ChemicalId equals a.ChemicalId 
      join w in WasteWaters on a.WasteWaterId equals w.WasteWaterId 
      join s in Samples on w.WasteWaterId equals s.WasteWaterId 
      join a2 in Analyses on new { a.ChemicalId, s.SampleId } equals new { a2.ChemicalId, SampleId = a2.SampleId.Value } 
      select new QueryModel { 
       WasteWaterName = w.WasteWaterName, 
       SampleDesciption = s.SampleDescription, 
       Chemical = c.ChemicalName, 
       MaxAllowed = a.MaxAllowance, 
       Result = a2.Result 
      }; 
+0

bei 'Join a2 in Analysen für neue {...' -> Ich bekomme eine wackelnde rote Linie und die Nachricht: Der Typ eines der Ausdrücke in der Verknüpfung ist falsch. Typinferenz fehlgeschlagen beim Aufruf von 'Join'. – Manu

+1

Können Sie die Klassen für Analysen, Berechtigungen und Beispiele veröffentlichen? Oder zumindest die Typen für alle beteiligten Bereiche? – NetMage

+0

a2.SampleId ist int? wheras am SampleId ist int -> also der Fehler! Samples.SampleId hat jedoch Beziehungen zu anderen Tabellen, in denen für SampleId nicht nullable int benötigt wird. Gibt es eine Möglichkeit, s.SampleId innerhalb des Joins zu übertragen? – Manu

0

Ich kann vermuten, dass Sie Ihre Abfrage über Abwasser gruppieren müssen, so dass Sie nicht mehrere Zeile für den gleichen Artikel haben.

Ich bin mir nicht sicher, aber sicher sind Sie nicht so weit von der Antwort entfernt.

Lassen Sie mich wissen.

+0

Sie meinen GroupJoin?, wie -> Join Erlaubnis in db.Allowances auf wasterwater.WasteWaterId entspricht. WasteWaterId in WasteWaterGroup – Manu

+0

Ich meine eine Gruppe nach Anweisung, aber ich bin mir nicht sicher, ob es funktioniert. – JBO

+0

Ich bin nicht vertraut mit "Gruppe für Unterricht" -> können Sie mehr Hilfe mit diesem oder einem Schlüsselwort geben, das ich google/suchen könnte? – Manu

Verwandte Themen