2008-12-17 3 views
5

Ich spiele um mit einigem Linq-SQL stuff, so etwas wie dies zu tun:Refactor Auswahl eines Teils von Linq Ausdruck?

var foo = from f in db.Foo where f.Bar > 5 select f; 

, die alles schön und gut ist, und ich weiß, dass ich dies auch tun können:

var foo = from f in db.Foo where f.Bar > 5 select new { f.Bar, f.Baz }; 

Was Ich möchte wissen, ob ich den ausgewählten Teil dieser Abfrage ausklammern kann, wenn ich zur Laufzeit feststellen möchte, welche Teile von Foo auszuwählen sind? Wie zum Beispiel:

var foo = from f in db.Foo where f.Bar > 5 select SomeMethodThatReturnsThePropertiesOfFooIReallyWant(); 

bearbeiten zu klären: Ich bin für die Syntax und Rückgabetyp von Somemethod suchen ...().

Wenn ich dies einige Male tun wollte:

select new { f.Bar, f.Baz }; 

aber auch andere Zeiten tun:

select new { f.Baz, f.Other }; 

Basierend auf Daten im Speicher (eine riesige Fallaussage ohne zu tun), wie würde ich Mach das, wenn möglich?

Antwort

2

Sicher, obwohl es in der fließenden Syntax einfacher:

var query_foo = db.Foo.Where(f=>f.Bar > 5); 
// : 
var foo =query_foo.Select(f=>SomeMethodThatReturnsEtc(f)); 
+0

Ich denke, meine eigentliche Frage ist, was ist die Syntax von SomeMethod()? – Jonas

+0

Was ist der Rückgabetyp von SomeMethodThatReturnsEtc? –

0

Ich denke, meine Frage ist, was ist die Syntax des Somemethod()? - Jonas (eine Stunde vor)

Die Art und Weise Sie es tun wollen, können Sie nur zurückgeben „Objekt“ aus dem Verfahren.

0

Sie müssen einen kleinen Projektionsausdruck (Select) dynamisch erstellen, um ihn an Ihre Basisabfrage anzuhängen, die filtert. finden Sie in einem der folgenden einige Beispiele:

Dynamic.cs in der dynamischen Abfrage Probe, dass Schiffe mit VS 2008

http://www.albahari.com/nutshell/predicatebuilder.aspx

0

Sie nicht anonyme Typen aus einer Funktion zurückgeben kann, so dass Sie stecken würde, mit deklarierten Typen, die gegen Ihre Frage oder Objekt, die nicht sehr hilfreich sein wird.

Mehr zu dem Punkt, was genau erwarten Sie mit Ihrem Ergebnis zu tun? Wenn die Mitglieder zur Kompilierungszeit tatsächlich unbekannt sind, bin ich nicht sicher, was Sie damit tun können ...

0

Manchmal ist die einfachste Sache zu tun, einfach eine einfache Datenklasse mit einem Haufen öffentlicher Get erstellen; und setzen; So können Sie Ihre Daten in diese Klasse auswählen. Wenn Sie mit nullwertfähigen Typen arbeiten, die beim Verbrauch der Daten ziemlich klar sind, können Sie bei Verwendung aller Zeichenfolgen möglicherweise etwas anderes sauberer finden, wenn es an der Zeit ist, die Daten zu konsumieren.

Ein einfaches Beispiel

public class MyData { 
public string Bar {get;set;} 
public int? Baz {get;set;} 
public DateTime? {get;set;} 
} 

var foo = from f in db.Foo where f.Bar > 5 select new MyData { Bar = f.Bar, Foo = f.Foo }; 

Sie auch Ihre Aussagen aus wie folgt trennen können, wenn Sie die Auswahl an einem anderen Ort als die select-Anweisung haben wollen, wird dies traf nur den Server, wenn Sie aufzuzählen versuchen es.

var foo = from f in db.Foo where f.Bar > 5 select f; 
var fooData = f.Select(new MyData .... }