【发布时间】:2020-08-04 20:53:53
【问题描述】:
我有一个动态查询,我需要根据 URL 参数中传递的值构建它。 传递的值可以为 null 或带值。 在此示例中,参数是标题。 我正在使用带有 FromSql C# 函数的字符串参数占位符:
var query = this.BookContext.BookModel.FromSql(
@"SELECT FROM Books b
WHERE b.title = {0}, title)
如果标题有值,则查询可以正常工作,但是当标题为空时我会遇到问题。
当 title 为 null 时,条件应该是 b.title IS NULL 因为 b.title = NULL 不起作用。
我的问题是如何在字符串参数占位符中传递IS NULL 条件?
我尝试构建一个动态条件,但它不允许在字符串参数占位符中使用,这是有道理的,因为字符串参数占位符没有任何好处
string bookCondition = title != "null" ? title : "title IS NULL";
var query = this.BookContext.BookModel.FromSql(
@"SELECT FROM Books b
WHERE b.title {0}, bookCondition)
谢谢,
【问题讨论】:
-
你真的不喜欢添加一个简单的 if 并构建两个不同的查询吗?
-
这是一个包含多个条件的长查询。我刚刚发布了简短版本以简化我的问题。所以如果条件不是我正在寻找的选项
-
string bookCondition = title == null ? "IS NULL" : $"= '{title}'"; -
.FromSql(string.Format("SELECT FROM Books b WHERE b.title {0}", bookCondition));BUT 你应该使用参数而不是像这样构建字符串,以避免sql注入。例如,如果title = "IS NULL; DROP TABLE [Books];--"怎么办?那会很麻烦。见:Little Bobby Tables -
您可能需要更加仔细地思考这是否真的是您想要的行为。如果用户正在搜索一本书,但他们没有提供书名,这真的意味着他们想要查找没有书名的书吗?还是他们只是不在乎标题是什么?
标签: c# asp.net-core-2.2