我认为我在这个方向上是正确的,但是遇到一些我说实话的事情却让我很沮丧。
我有一个带有Geography的表,因此,到目前为止,在EFCore的地理支持之前,我正在为一个特定的表构建自己的SQL查询。它实际上是一种搜索,因此它基于一组可以传递到终点的查询参数进行动态构建。
因此,我使用反射来遍历DTO并根据具有值的属性构建SQL查询。我要从查询构建器返回一个元组,其中包含一个List<SqlParameter>
和List<string>
,后者是原始sql,而前者是参数。
然后,我将它们汇总在一起。
我遇到以下问题:
//This is inside my SQL Param builder method which returns a
//Tuple of sqlQuery and sqlParams
if (!string.IsNullOrEmpty(search.Municipality))
{
sqlQuery.Add("Municipality LIKE %@Municipality%");
sqlParams.Add(new SqlParameter("@Municipality", search.Municipality));
}
//Thi lines aggregates the result to build a SELECT * FROM query
sql = sqlParams.Item2.Aggregate(sql, (current, t) => current + " AND " + t);
//This executes the query
return DbSet.FromSql(sql, sqlParams.Item1.ToArray()).ToListAsync();
//This is the generated SQL string that is printed from the sql variable above
SELECT * FROM AirportData WHERE Municipality LIKE %@Municipality%
//This is the error I get from EFCore
System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '@Municipality'.
我现在仅使用1个参数来实现此功能。
有什么想法为什么不将SQL Param转换为查询值?我在这里完全不在基地吗?在此先感谢您的查找和任何建议?
答案 0 :(得分:2)
该错误不是来自EF Core,而是SqlServer,因为%@Municipality%
不是有效的SQL表达式。
它应该类似于'%' + @Municipality + '%'
或N'%' + @Municipality + N'%'
,因此请相应地修改您的SQL构建器,例如
sqlQuery.Add("Municipality LIKE '%' + @Municipality+ '%'");
答案 1 :(得分:0)
我猜想EF核心不直接支持sqlparameter,所以我使用示例。 FromSql(string,params object[])
字符串:sql查询
params:sql参数(@key或{0})
SqlCommand command = new SqlCommand
{
CommandText = @"SELECT DISTINCT * FROM F_SearchQuery(@keys)"
};
SqlParameter k = new SqlParameter("@keys", keys ?? (object)DBNull.Value);
return _repositoryCustom.JobSearchQuering.FromSql(command.CommandText, k).ToList();