簡體   English   中英

Linq 類似於 sql 字符串的謂詞

[英]Linq like predicate to sql string

I want to make a function which should accept linq like expression based on model and property types of models and return a SQL string.

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 天。 我只是找不到解決方案。

解決方案一點也不簡單。 你必須處理Expression<Func<TModel, bool>> whereExpression

然后你可以訪問這個表達式ExpressionVisitor例如這個答案並生成 SQL。

或者您可以使用 escaping 字符串、日期等來節省您的時間,安裝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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM