2016-10-17 2 views
1

Ich habe diese Klasse:kann nicht zuweisen Eigenschaft Objekt nach aus der Datenbank bekommen

public class Product { 
    [NotMapped] 
    public bool Recommended {get;set;} 

    public int ID {get;set;} 
    //Other stuff 
} 

Dann habe ich sie aus der Datenbank erhalten und die empfohlenen Variablen zuweisen. Ich habe sie alle für wahr gemacht, während ich teste und das funktioniert.

var Products = Find(SearchParams, DataContext).ToList(); 
foreach(var product in Products) { 
    product.Recommended = true; 
    if (!product.Recommended) throw new Exception(); 
} 

Ok, es funktioniert, wir bestehen.

Dann gehe ich und eine Reihe von Ergebnissen machen, die wie folgt aussehen:

public class QuoteProduct { 
    public Product Product {get;set;} 
    public Quote Quote {get;set;} 
    //etc 
} 

und ordnen die Produkte:

var Results = new List<QuoteProduct>(); 
foreach(var product in Products) { 
    var entry = new QuoteProduct(){ 
     Product = product; 
     Quote = getQuote(this); 
    } 
    if (!entry.Product.Recommended) throw new Exception(); 
    Results.add(entry); 
} 

und diese Ausnahme wird immer geworfen! Warum? Selbst wenn, kurz bevor es ich tun:

entry.Product.Recommended = true; 
    if (!entry.Product.Reccomended) throw new Exception(); 
+0

Was ist die genaue Ausnahme? – mybirthname

+0

dieser: neue Ausnahme werfen(); –

+0

Wo ist der Code für dieses 'getQuote (this)'? – Sampath

Antwort

2

Verzögerte Auswertung Problem

Find(SearchParams, DataContext); wahrscheinlich kehrt ein IEnumerable<> so dass jedes Mal, wenn Sie es durchlaufen, neue Product Klassen generiert werden. Dies macht die product.Recommended = true; nutzlos.


hier:

var Products = Find(SearchParams, DataContext); 
foreach(var product in Products) // <--- here it's iterated and new classes instantiated 
{ 
    product.Recommended = true; 
    if (!product.Recommended) throw new Exception(); 
} 

und hier:

var Results = new List<QuoteProduct>(); 
foreach(var product in Products) // <-- and here are new classes instantiated 
// So your previous `product.Recommended = true;` is gone! 
{ 
    var entry = new QuoteProduct(){ 
     Product = product; 
     Quote = getQuote(this); 
    } 
    if (!entry.Product.Recommended) throw new Exception(); 
    Results.add(entry); 
} 

Sie können das Problem beheben mit:

// The key is to persist the data with (for example) ToArray() or ToList() 
var Products = Find(SearchParams, DataContext).ToArray(); 

Der Nachteil der Persistenz ist, dass alle Zeilen gleichzeitig in den Speicher geladen werden. (deshalb ist die faule Auswertung nützlich)

+0

Ja, ich habe versucht 'foreach (var Produkt in Products.ToList()) {' schien nicht zu funktionieren. –

+0

Der Punkt, an dem Sie die 'var-Produkte' speichern, muss iteriert werden (so löst eine' ToList() 'von' ToArray() 'das. –

+0

Sie könnten dies lesen: https://blogs.msdn.microsoft .com/pedram/2007/06/02/lazy-evaluation-in-c/ –

Verwandte Themen