Seguir y crear un LINQ Provider (estoy seguro de que no desea hacer esto, de todos modos).
Es mucho trabajo, así que tal vez lo que desea es utilizar NHibernate o Entity Framework o algo por el estilo.
Si sus preguntas son bastante simples, tal vez usted no necesita un proveedor LINQ completo soplado. Eche un vistazo a Expression Trees (que son utilizados por los proveedores de LINQ).
Puede piratear algo como esto:
public static class QueryExtensions
{
public static IEnumerable<TSource> Where<TSource>(this Repo<TSource> source, Expression<Func<TSource, bool>> predicate)
{
// hacks all the way
dynamic operation = predicate.Body;
dynamic left = operation.Left;
dynamic right = operation.Right;
var ops = new Dictionary<ExpressionType, String>();
ops.Add(ExpressionType.Equal, "=");
ops.Add(ExpressionType.GreaterThan, ">");
// add all required operations here
// Instead of SELECT *, select all required fields, since you know the type
var q = String.Format("SELECT * FROM {0} WHERE {1} {2} {3}", typeof(TSource), left.Member.Name, ops[operation.NodeType], right.Value);
return source.RunQuery(q);
}
}
public class Repo<T>
{
internal IEnumerable<T> RunQuery(string query)
{
return new List<T>(); // run query here...
}
}
public class TestModel
{
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
var repo = new Repo<TestModel>();
var result = repo.Where(e => e.Name == "test");
var result2 = repo.Where(e => e.Id > 200);
}
}
Por favor, no use esto como es. Este es solo un ejemplo rápido y sucio de cómo se pueden analizar los árboles de expresión para crear declaraciones SQL.
Por qué no utilizar Linq2Sql, NHibernate o ADO.NET Entity Framework ...
http://www.linqpad.net/ podría ayudarle. –
Debe usar un marco O/RM que habilite LINQ sobre Expresiones, como LINQ to SQL o Entity Framework. – Steven
¿Desea implementar un [proveedor de consultas] (http://msdn.microsoft.com/en-us/library/system.linq.iqueryprovider.aspx)? – phg