, , , .
LINQ , System.Linq.Expressions. , .
LINQPad , , , , , .
, LINQPad .
var query = from p in Puzzles
select p;
query.Expression.Dump(20);

, , LINQ?
, :
var query = from person in data
select person;
" ".
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace TestLinqGenerator
{
class Program
{
static void Main(string[] args)
{
var data = new[]
{
new {Name = "Fred"},
new {Name = "Simon"}
}.AsQueryable();
var dataType = data.ElementType;
var source = Expression.Constant(data);
var parameter = Expression.Parameter(dataType, "person");
var lambda = Expression.Lambda(parameter, parameter);
var callSelect = Expression.Call(GetSelect().MakeGenericMethod(dataType, dataType), source, Expression.Quote(lambda));
var query = data.Provider.CreateQuery(callSelect);
var results = query.Cast<object>().ToList();
}
private static MethodInfo GetSelect()
{
return typeof(System.Linq.Queryable).GetMethods().Where(
method => method.Name == "Select" && method.GetParameters().Length == 2 &&
method.GetParameters()[1].ParameterType.GetGenericArguments()[0].Name == typeof(Func<,>).Name).Single();
}
}
}
, . , , .
Queryable.Select Reflector , . :
public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (selector == null)
{
throw Error.ArgumentNull("selector");
}
return source.Provider.CreateQuery<TResult>(Expression.Call(null, ((MethodInfo) MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[] { typeof(TSource), typeof(TResult) }), new Expression[] { source.Expression, Expression.Quote(selector) }));
}
, Queryable.Select LINQ . LINQ - - TSQL. Select .
- LINQ.
, , Queryable.Where LINQ. (select new {x, y, z} ..), . , . System.Reflection.Emit - .
, LINQ, LINQ to Entities, LINQ to SQL, Mindscape Lightspeed LINQ , AsQueryable.
, LINQ, IQueryable Mindscape Lightspeed IQueryables, . , IQueryable, AsQueryable, LINQ. - , , . , .