SQL字符串的Linq类 predicate

t1rydlwq  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(172)

我想做一个函数,它应该接受基于模型和模型属性类型的linq类表达式,并返回一个SQL字符串。

public class MyModel
{
    public int Year { get; set; }

    public string UserName { get; set; }
}

public static class MyControlClass
{
    public static string BuildSQL<TModel>(Func<TModel, bool> whereExpression)
    {
        return $"SELECT * FROM {nameof(TModel)} WHERE {whereExpression}";
    }
}

public main(){
    string sqlQuery = MyControlClass.BuildSQL<MyModel>(m => m.Year == 2021 && UserName == "Tester");
    
    //What I wish sqlQuery to be
    //SELECT * FROM MyModel WHERE Year = 2021 AND UserName = "Tester"
}

有什么想法如何完成这一点?我知道POCO和其他ORM库,我已经尝试和搜索了3天多,现在。我只是找不到解决方案。

wfsdck30

wfsdck301#

解决方案一点也不简单。而且您必须处理Expression<Func<TModel, bool>> whereExpression
然后,您可以访问此表达式ExpressionVisitor(例如this answer)并生成SQL。
或者,您也可以使用转义字符串、日期等来保存时间,安装linq2db后只需写入:

public class MyModel
{
    public int Year { get; set; }

    public string UserName { get; set; }
}

public static void Main()
{   
    // create options builder
    var builder = new LinqToDbConnectionOptionsBuilder();

    // configure connection string
    var options = builder.UseSqlServer(connectionString);

    using var db = new DataConnection(options);

    var query = db.GetTable<MyModel>().Where(m => m.Year == 2021 && m.UserName == "Tester");

    // will generate SQL
    var sql = query.InlineParameters().ToString();

    // will return list of items
    var items = query.ToList();
}

相关问题