gpt4 book ai didi

c# - 如何将 Lambda 表达式转换为 Sql?

转载 作者:太空狗 更新时间:2023-10-29 20:55:03 26 4
gpt4 key购买 nike

我正在开发一个小型框架来访问数据库。我想添加一个使用 lambda 表达式进行查询的功能。我该怎么做?

public class TestModel
{
public int Id {get;set;}
public string Name {get;set;}
}

public class Repository<T>
{
// do something.
}

例如:

var repo = new Repository<TestModel>();

var query = repo.AsQueryable().Where(x => x.Name == "test");
// This query must be like this:
// SELECT * FROM testmodel WHERE name = 'test'

var list = query.ToDataSet();
// When I call ToDataSet(), it will get the dataset after running the made query.

最佳答案

继续创建一个 LINQ Provider (无论如何,我相信你不想这样做)。

工作量很大,所以也许您只想使用 NHibernateEntity Framework或类似的东西。

如果您的查询相当简单,也许您不需要成熟的 LINQ 提供程序。看看Expression Trees (由 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...

关于c# - 如何将 Lambda 表达式转换为 Sql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10979017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com