【问题标题】:SQLKata Inner Join using LEFT string function使用 LEFT 字符串函数的 SQLKata 内连接
【发布时间】:2020-03-19 12:42:48
【问题描述】:

我正在尝试使用 SQLKata for SQLServer 编写以下查询:

SELECT Company FROM Table1 INNER JOIN Table2 ON LEFT(Table1.[Company], 5) = LEFT(Table2.accountName, 5)

我尝试了以下方法:

        var db = new QueryFactory(connection, compiler);


        var query = db.Query("Table1")
            .Join("Table2", "LEFT([Table1].[Company],5)", "LEFT([Table2].[accountName],5)")
            .Select("Company").Get();

但失败并出现错误“无法绑定多部分标识符”。

看来我也没有可以在 sqlKata 中使用的 JoinRaw。有谁知道我是否可以在 sql kata 中创建一个左字符串函数并在上面的查询中使用?

【问题讨论】:

  • 使用 SQL Server Management Studio 并运行查询。 SSMS 中的错误消息要好得多,并且相同的命令文本查询将在 SSMS 中运行。似乎无法连接数据库中的两个表。可能一个是整数,另一个是字符串。列名拼写不正确可能是错字。 SSMS 将给出确切的错误类型。
  • 我上面复制的 sql 语句在 SSMS 中有效。我想要做的是在 SQLKata 中重新创建这个语句。我不知道这是否可能,因为我不知道是否有办法在 SQLKata 中创建 LEFT() 字符串函数,这就是我想要找出的。
  • 看起来您正在使用实体,其中有映射到数据库的类。所以我不知道你为什么 Join 使用字符串而不是 db 类属性。
  • 我没有使用实体框架。我正在使用 SQLKata。
  • 我不太了解SQLKata。我建议将您的查询分成多个部分,并确保每个部分不返回空值。请参阅 SQLKata 文档:sqlkata.com/docs/join

标签: c# sql-server inner-join sqlkata


【解决方案1】:

这里的问题是Sqlkata在Join方法参数中期望列名作为字符串,没有任何包装器或函数,原因是为了防止SQL注入,所以这里不允许使用表达式。

对于这种情况,您可以使用 FromRaw 方法(请参阅https://sqlkata.com/docs/from#from-a-raw-expression)。

db.Query().FromRaw("[Table1] JOIN [Table2] LEFT([Table1].[Company],5) ON LEFT([Table2].[AccountName],5)")

在即将发布的版本中,您可以针对此类情况注入 RawExpression,但这尚未正式发布。

db.Query("Table1").Join(
  "Table2", 
  Raw("Left([Table1].[Company], 5)"), 
  Raw("Left([Table2].[AccountName], 5)")
)

附带说明,不建议基于计算的表达式执行连接,这可能会导致性能问题。

【讨论】:

  • 谢谢!这正是我一直在寻找的。我不知道为什么我没有想到使用 FromRaw。
猜你喜欢
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多