2008-12-17 21 views
5

estoy jugando un poco con un poco de materia LINQ-SQL, haciendo algo como esto:Refactor selecciona parte de la expresión Linq?

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

que es todo lo fino y elegante, y sé que también puedo hacer esto:

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

Lo Quiero saber si puedo factorizar la parte seleccionada de esa consulta, si quiero determinar en tiempo de ejecución qué partes de Foo seleccionaré. Tales como:

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

Editar para aclarar: Busco la sintaxis y el retorno tipo de SomeMethod ...().

Si quería hacer esto algunas veces:

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

pero otras veces hacer esto:

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

Sobre la base de datos de la memoria (sin hacer una declaración de caso gigante), ¿cómo me hacer eso, si es posible?

Respuesta

2

Claro, aunque es más fácil en la sintaxis de fluidez:

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

Supongo que mi verdadera pregunta es, ¿cuál es la sintaxis de SomeMethod()? – Jonas

+0

¿Cuál es el tipo de devolución de SomeMethodThatReturnsEtc? –

0

supongo que mi verdadera pregunta es, ¿qué es la sintaxis de la SomeMethod()? - Jonas (hace una hora)

De la manera que desee hacerlo, solo puede devolver el "objeto" del método.

0

Tendrá que crear dinámicamente una pequeña proyección (Seleccionar) para abordar su consulta base que filtra. Ver uno de los siguientes para ver algunos ejemplos:

Dynamic.cs en la muestra de consulta dinámica que se incluye con VS 2008

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

0

que no pueden volver tipos anónimos de una función, por lo que se quedaban atascados con tipos declarados, lo que va en contra de su pregunta, u Objeto, que no será de mucha ayuda.

Más al punto, ¿qué esperas hacer con tu resultado? Si los miembros son realmente desconocidos en el momento de la compilación, no estoy seguro de qué hacer con eso ...

0

A veces lo más fácil es crear una clase de datos simple con un montón de get público; y establecer; para que pueda seleccionar sus datos en esa clase. Si está tratando con tipos anulables que serán bastante claros cuando consuma los datos, aunque si se trata de todas las cadenas, es posible que encuentre algo más limpio cuando llegue el momento de consumir los datos.

Un ejemplo sencillo

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 }; 

También puede separar sus declaraciones fuera como esto si usted quiere tener la selección en un lugar diferente a la instrucción de selección, esto sólo llegarán al servidor cuando intenta enumerar eso.

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