2011-01-14 6 views
2

Ich habe eine VS2010-Lösung, bestehend aus zwei Projekten - ein "Daten" -Projekt und ein Webservice-Projekt, das das Datenprojekt verbraucht. Um das Schema der Datenbank zu schützen, habe ich mich entschieden, anonyme (var) Objekte an den Consumer des Webservice zurückzugeben. Meine Frage ist, einige von denen, die ich zurückgebe, werden in Sammlungen sein. Anstatt also den Code die Verwendung ein einziges anonymes Objekt zurückgeben:Zurückkehrende Sammlung von anonymen Typen in C#

var item = from w in db.Widgets 
    where w.widget_id == 1 
    select new { 
     name = w.name, 
     address = w.address 
    }; 

Ich mag das etwas verwenden, ähnlich wie eine Sammlung zurückzukehren.

IQueryable<var> item = (from w in db.Widgets 
     where w.widget_id == 1 
     select new { 
      name = w.name, 
      address = w.address 
     }).IQueryable; 

Ich weiß, dies ist nicht der genaue Weg, dies zu tun ... müssen nur wissen, wie es wirklich gemacht würde.

Danke!

+2

Wenn Sie anonyme Typen zurückgeben, woher weiß der Anrufer, welche Eigenschaften verwendet werden sollen? –

Antwort

4

Anstatt anonyme Typen zurückzugeben, hätte ich eine stark typisierte Ebene, die zurückgegeben wird. Es kann immer noch aus der Datenbank gefüllt werden, wie Sie wollen, und Sie haben einen starken Vertrag für den Verbraucher des Dienstes. Der Verbraucher wird nicht einmal wissen, dass es eine Datenbank gibt, es könnte genauso gut XML sein.

5

Anonyme Typen selbst können nicht außerhalb ihrer deklarierenden Funktion verfügbar gemacht werden. Daher ist die einzige Möglichkeit, eine Instanz eines anonymen Typs außerhalb der deklarierenden Funktion verfügbar zu machen, ein object. Wenn Sie dies tun müssen, müssen Sie einen Typ in einem höheren Bereich mit den Eigenschaften deklarieren, die Sie benötigen, und ihn dann in Ihrer Abfrage statt im anonymen Typ hydratisieren.

3

Sie könnten in der Theorie, dies zu tun:

public List<object> GetObjects() 
{ 
    return (from w in db.Widgets 
     where w.widget_id == 1 
     select (object) new { 
      name = w.name, 
      address = w.address 
     }).ToList(); 
} 

Aber ich verstehe nicht, warum Sie dies tun wollen - der Anrufer offensichtlich nicht in der Lage sein, jede Nutzung Ihres anonymen Typs zu machen, außer über Reflection oder andere Hacky-Sachen. Warum nicht einfach eine normale Klasse zurückgeben, die jeder normal benutzen kann?

public class NameAndAddress 
{ 
    public string Name { get; private set; } 
    public string Address { get; private set; } 
    public NameAndAddress(string name, string address) 
    { 
     Name = name; 
     Address = address; 
    } 
} 

public List<NameAndAddress> GetObjects() 
{ 
    return (from w in db.Widgets 
     where w.widget_id == 1 
     select new NameAndAddress(w.name, w.address) 
    ).ToList(); 
}