Chain When 子句使用 SqlKata

Chain When Clause's using SqlKata

使用 SqlKata 查询构建器,我想根据我拥有的值构建一个更新查询。 鉴于此代码:

   var query = new Query("Users");

   var user = new User{Age = 28, Name = "John"};


   query.When(user.Age != null, q => q.AsUpdate(new {Age = user.Age}))
       .When(user.Name != null, q => q.AsUpdate(new {Name = user.Name}));

生成的sql只有最后一个真值子句。

这是预期的,您的代码类似于以下内容

if(age != null)
{
    query.AsUpdate(new {Age = age})   
}

if(name != null)
{
    query.AsUpdate(new {Name = name})   
}

在这种情况下,最后一个真实的陈述将始终得到评估。

如果你想使用 .When 方法至少你必须使用第二个参数 WhenNot 来评估 else 部分。

var query = new Query("Users").When(age != null, 
    q => q.AsUpdate(new {Age = age}),
    q => q.When(name != null,  q2 => q2.AsUpdate(new {Name = name}))
);

在操场上检查这个例子:WhenNot example

但为了更灵活的方式,我建议使用字典对象并过滤掉可为 null 的值。

类似于 (link)

using System.Collections.Generic;
using System.Linq;

var values = new Dictionary<string, object> {
    {"Age", null},
    {"Name", "ahmad"}
}.Where(x => x.Value != null).ToDictionary(x => x.Key, x => x.Value);

var query = new Query("Users").AsInsert(values);