2009-05-22 3 views
2

Ich versuche Linq zu verwenden, um jede Zeile aus einer DB-Abfrage in ein Wörterbuch zu projizieren, das einen benutzerdefinierten Typ als Wert hat. Ich bin mir nicht sicher über die LINQ-Syntax, um dies zu tun?Wie projiziere ich ein Wörterbuch mit einem benutzerdefinierten Typ mit Linq to SQL?

Dies ist mein derzeitiger Versuch (der nicht kompiliert, aber zeigen sollte, was ich versuche). Ich habe Probleme mit dem 'Select New ...' Teil.

public class MyClass 
{  
    public Dictionary<int, CustomType> dict; 
} 

public class MyType{   
    string Name; 
    decimal Value; 
} 

var result = (from t in table 
       select new { 
       t.Id, 
       new MyType(t.Name,t.Value) 
       }).AsEnumerable().ToDictionary(); 

ANTWORT:

Dank Jason. Ich habe nur Eigenschaften und automatische Initialisierer anstelle eines Konstruktors verwendet. Der Arbeits Code ähnelt diese (alle Verbesserungen sind uns immer willkommen):

public class MyType {   
    public string Name {get;set;} 
    public decimal Value { get; set;} 
} 

Dictionary<int, CustomType> dict; 

dict = (from t in table 
     select new { 
      id = av.Account.Id, 
      mt = new MyType { Name = t.Name, Value = t.Value } 
     }).ToDictionary(item => item.id, item => item.mt); 

Antwort

5

MyType keinen Konstruktor haben, die zwei Argumente übernimmt.

die folgende auf die Definition von MyType hinzufügen:

public MyType(string name, decimal value) { 
    Name = name; 
    Value = value; 
} 

Ferner Sie nicht den anonymen Typ Mitglied von

new MyType(t.Name, t.Value) 

einen Namen definiert gegeben hat; Versuchen Sie, diese Zeile zu ändern:

MyType = new MyType(t.Name, t.Value) 

Der Compiler wird Sie anschreien, dass es keinen Namen für dieses anonyme Mitglied erkennen kann.

Schließlich gibt es keine Überlastung von ToDictionary, die keine Argumente hat. Angenommen, Sie haben das oben genannte anonyme Mitglied als MyType bezeichnet, ändern Sie den Anruf in ToDictionary in

....ToDictionary(item => item.Id, item => item.MyType);