c# - 如何使用 Entity Framework SqlQuery 保护 SQL 参数?

标签 c# asp.net .net sql-server entity-framework

我有这个方法,应该使用未知数量的 id。 我几乎完成了这个方法,但由于显而易见的原因,它还不安全,我知道我可以编写自己的方法来去除参数,但通过使用一些内置方法我会更舒服。

这是方法

public static List<LocationModel> FetchCitiesByAreas(IEnumerable<string> areas)
    {
        using (var db = new BoligEnt())
        {
            var sqlQuery = new StringBuilder();
            var first = true;

            sqlQuery.Append("SELECT DISTINCT a.city AS City, a.zip AS Zip ");
            sqlQuery.Append("FROM zip_city AS a ");
            sqlQuery.Append("WHERE country = 1 ");

            foreach (var d in areas)
            {
                if (first)
                {
                    sqlQuery.Append("AND a.area_id = '" + d + "'");
                    first = false;
                }
                else
                {
                    sqlQuery.Append("OR a.area_id = '" + d + "'");
                }

            }

            return db.Database.SqlQuery<LocationModel>(sqlQuery.ToString()).ToList();
        }
    }

我知道它内置了这个功能,但正如我之前所说,我不知道将要输入的 ID 的确切数量

db.Database.SqlQuery<LocationModel>("SELECT * FROM table WHERE id = @p0 ;", id).ToList();

谢谢

最佳答案

虽然我完全同意 paqogomez 的观点,即您应该只使用 LINQ 进行查询,但 .SqlQuery 可以采用参数数组。您可以将声明更改为如下所示:

var sqlQuery = new StringBuilder();

sqlQuery.Append("SELECT DISTINCT a.city AS City, a.zip AS Zip ");
sqlQuery.Append("FROM zip_city AS a ");
sqlQuery.Append("WHERE country = 1 ");

for (int i = 0; i < areas.Count; i++)
{
    if (i == 0)
    {
        sqlQuery.Append("AND (a.area_id = @p" + i.ToString());
    }
    else
    {
        sqlQuery.Append(" OR a.area_id = @p" + i.ToString());
    }
}
sqlQuery.Append(")");

var results = db.Database.SqlQuery<LocationModel>(sqlQuery.ToString(), areas.ToArray()).ToList();

我在您的查询中添加了缺少的括号,以便正确过滤掉 OR 结果。我还假设 areas 类似于 List,或者至少是您可以轻松获取计数的东西。

关于c# - 如何使用 Entity Framework SqlQuery 保护 SQL 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26150017/

相关文章:

c# - 在 asp.net 中更改区域性时实例是只读异常

c# - 调试器未附加到进程

c# - 如何更改 DevExpress GridView 中一行的背景颜色?

c# - 为什么 C# Func<int> 不能赋值给 Func<object>?

c# - X文档解析错误

asp.net - 中继器更新面板中的匹配 ID - "already contains a definition for..."

ASP.NET MVC : Is is possible to set a global variable?

java - 在 java webservice 和 asp.net 客户端 Web 应用程序之间发送的数据库对象的序列化

c# - 将 Visual Studio 2012 中的数据源从 SQLSRV 更改为 MySQL

c# - WPF:如何在 MVVM 中组织 View 模型?