2012-03-29 11 views
1

Ich möchte Elemente aus einer Tabelle auswählen, diese Elemente haben Beziehungseigenschaften, kann ich sie projizieren, wenn sie nullfähig sein könnten (dh wie linker Join)? Und wenn nicht wie ich das umgehen kann?LINQ Projizieren von Beziehungseigenschaften mit null

class MyProducer 
{ 
    .... 
}  

Model model = new Model(); 
var q = 
    model.Products 
    .Select(
     p => 
     new 
     { 
      id = p.Id, 
      producer = p.Producer != null ? new MyProducer { id = p.Producer.Id } : null 
     }); 

var r = q.ToArray(); 

Wenn ich diesen Code ausführen Ich habe Ausnahme

Es kann keine Null konstanten Wert des Typs schaffen ‚MyProducer‘. Nur Entitätstypen, Aufzählungstypen oder primitive Typen werden in in diesem Kontext unterstützt.

+0

@Alle: Wenn ich den Fehler näher betrachte, vermute ich, dass er irgendwo anders ist. Beachten Sie, dass es 'null constant value' heißt und ich hier nichts mit Konstanten zu tun habe. – Rawling

+0

Was ist der Ausnahmetyp? – jrummell

Antwort

0

Sie müssen werfen Sie Ihre null zu Struct:

Model model = new Model(); 
var q = model.Products.Select(p => new { id = p.Id, producer = 
    p.Producer != null ? new Struct { id = p.Producer.Id } : (Struct)null }); 
+0

Sorry "Struct" ist ein schlechter Name für Klasse, eigentlich ist Struct Klasse. – baio

+0

Entfernen Sie einfach das '' 'dann. – DaveShaw

+0

Immer noch nicht funktioniert, die gleiche Ausnahme – baio

1

Warum Sie nicht links JOIN?

using(var model = new Model()) 
{ 
    var q = 
    from product in model.Products 
    join producer in model.Producers.DefaultIfEmpty() 
    on product.ProducerId equals producer.Id 
    select new 
    { 
     Id = product.Id, 
     Producer = producer != null ? new MyProducer{ Id = producer.Id} : null 
    } 
} 
+0

Ich versuche etwas wie Mapping zwischen LINQ-Entitäten und meinen Modellen zu erstellen, im Falle der linken Join wäre es hässlich. Wie Sie sehen können, werden 2 Zeilen des ursprünglichen Codes 5 + Zeilen der linken Verknüpfung. Dies ist von der Lesbarkeit des Codes her unangenehm. – baio

+0

@baio, wenn Sie die Anzahl der Zeilen reduzieren möchten, setzen Sie einfach den anonymen Typ Initialisierer auf eine einzelne Zeile 'wählen Sie neue {Id = product.Id, Producer = Produzent! = Null? new MyProducer {Id = producer.Id}: null} ' – RePierre

+0

Ok Ich verstehe, dass du sagen wolltest, aber eigentlich ist das nur ein Beispiel für Code, der echte Code ist auf eine bestimmte Art und Weise geschrieben und ich würde es nicht ablehnen wollen , wenn es möglich ist. – baio

0

Nicht sicher, ob dies der einzige Weg ist, um die Projektion einer möglicherweise null Beziehung zu handhaben, aber das ist, wie ich es in der Vergangenheit getan habe. Sie erstellen Ihr neues Objekt und überprüfen dann beim Festlegen Ihrer Eigenschaften entsprechend auf Null. Das einzige Problem bei dieser Lösung besteht darin, dass Sie jetzt überprüfen müssen, ob die Eigenschaft 'id' von 'producer' '0' ist, um zu wissen, ob die Beziehung null war. Wenn es einen besseren Weg gibt, dies zu handhaben, würde ich es lieben, wenn es jemand hier posten würde.

var q = 
    model.Products 
    .Select(p => new 
     { 
      id = p.Id, 
      producer = new MyProducer 
      { 
       id = p.Producer == null ? 0 : p.Producer.Id 
      } 
     } 
    ); 

var r = q.ToArray(); 
Verwandte Themen