继续并创建一个LINQ 提供程序(我相信您无论如何都不想这样做)。
这是很多工作,所以也许您只想使用NHibernate或实体框架或类似的东西。
如果您的查询相当简单,也许您不需要完整的 LINQ 提供程序。查看表达式树(由 LINQ 提供程序使用)。
你可以破解这样的东西:
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);
}
}
请不要按原样使用它。这只是一个快速而肮脏的示例,如何分析表达式树以创建 SQL 语句。
为什么不直接使用 Linq2Sql、NHibernate 或 EntityFramework...