2012-04-13 11 views
5

Ich habe eine Linq to Entities-Abfrage der folgenden Form:Die verschachtelte Abfrage wird nicht unterstützt. Operation1 = 'UnionAll' Operation2 = 'MultiStreamNest'

var x = from a in SomeData 
    where ... some conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var y = from a in SomeData 
    where ... some other conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var results = x.Concat(y); 

(Dies ist ein vereinfachtes Beispiel - das 'wo' und 'Auswahl' Klauseln sind komplexer ., als hier gezeigt ich bin ist, hat einfach zu kompliziert, eine einzige kombinierte eine wie das Erstellen separate Abfragen-Anweisungen zu viele conditionals und nimmt ein Alter)

Compiliert fein, zu kompilieren, aber mit Ausnahme bei der Ausführung fehlschlägt:

"The nested query is not supported. Operation1='UnionAll' Operation2='MultiStreamNest' 

Hinweis: Ich versuche, in eine verschachtelte typisierte Struktur zu projizieren. Wenn ich .ToList() auf x und y vor dem Concat() aufrufe, funktioniert es gut. Als weiteren Punkt ist eine meiner Eigenschaften eine Enumeration, die ich jedoch mithilfe einer Integer-Wrapper-Eigenschaft zuweisen kann.

Gibt es eine Möglichkeit, dass ich tun kann, was ich tun möchte, ohne alle Daten in den Speicher zu ziehen? Oder ist es das Enum, das den Fehler verursacht?

Danke,

T

Antwort

0

Haben Sie mit

versucht
var results = x.Union(y); 

?

Tiz

oder

var x = (from a in SomeData 
where ... some conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}).Concat(
from a in SomeData 
where ... some other conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}); 
+0

Ich habe versucht, die zweite von diesen und scheint sich genauso zu verhalten wie zuerst, dh funktioniert nicht wie ich gehofft habe (siehe mein Kommentar auf @ Arions Beitrag. –

+0

... die jetzt gelöscht wurde. Wie auch immer, don ' Denken Sie daran, Union zu verwenden, da die Ergebnismengen ohnehin unterschiedlich sein müssen, aber dann bekomme ich die Ausnahme "Die 'Distinct' -Operation kann nicht auf die Kollektion ResultType des angegebenen Arguments angewendet werden." Ich glaube, Distinct kann das Nested nicht verarbeiten –

+0

Wenn leer? Wie ist es Verhalten? – innovia

0

ich das ähnliche Problem hatte während mehrerer Sätze von Navigationseigenschaften in einzelnen IEnumerable zu verketten oder Vereinigung versucht, hier ist das Code-Beispiel:

var requiredDocuments =     
       (from x in db.RequestTypes where (some condition) select x.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       .Concat(
       (from c in db.Categories where (some condition) select c.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ) 
       .Concat(
       (from f in db.Fields where (some condition) select f.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ); 
+0

Ist das Ihr problematisches Bit oder ein funktionierender Code? – Jerther

+0

als dies ruft ToList vor dem Ausführen der Concat dies sollte funktionieren. – Florian

0

Wenn ich richtig verstehe, was Sie zu tun versuchen, bin ich mehrmals auf dasselbe Problem gestoßen. Die Quintessenz ist, dass das Ausführen von Unionen mit geschachtelten Projektionen nicht unterstützt wird. Wenn Sie dies tun müssen, müssen Sie die Ergebnisse zuerst mit ToList materialisieren.

Verwandte Themen