【问题标题】:Chain When Clause's using SqlKataChain When 子句使用 SqlKata
【发布时间】:2020-08-18 22:43:26
【问题描述】:

使用 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只有最后一个truthy子句。

【问题讨论】:

  • 您希望 SQL 查询是什么样的?在我看来,您正在为不同的列更新构建几个具有不同条件的更新查询。 (如果是这种情况,您必须为每个查询创建一个新查询)。
  • UPDATE Users SET Age = 28 , Name = "John" WHERE...。我没有在问题中添加 Where 子句...
  • 所以你想为每条记录更新多个列,匹配多个条件?然后你只需要使用一个.When() 调用并结合参数。 .When(user.Age != null && user.Name != null, x => x.AsUpdate(new {Age = 1, Name = "Steve"}));
  • 如果只有一个有值,我想更新那个字段。如果name为null,我还是要更新age,反之亦然。
  • 这应该在您的问题中指定。为此,您需要将.AsUpdate() 对象构建为ExpandoObject,然后使用您从数据中定义的逻辑来构建它。构建对象后,您可以将其强制转换为动态对象并在.AsUpdate((dyamic)expandoObject) docs.microsoft.com/en-us/dotnet/api/… 中引用它具体查看部分标题Enumerating and Deleting Members

标签: c# sql sqlkata


【解决方案1】:

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

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

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

类似于 (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);

【讨论】:

    猜你喜欢
    • 2019-08-22
    • 2019-10-12
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多