参数化 SQL 查询
Parametrized SQLQuery
我在我当前的项目中使用了 LINQ,但是这个查询在 LINQ 中设计起来似乎很复杂,所以我决定尝试 SQLQuery。
SqlConnection connection = new SqlConnection( db.Database.Connection.ConnectionString );
connection.Open();
string query = "SELECT dateadd(WEEK, x.WeekOffset,0) as [Week],"
+ " AVG(x.SessionAmount * x.SessionTime) as [WeeklyAverage],"
+ " STDEV(x.SessionAmount * x.SessionTime) as [WeeklyStDev],"
+ " FROM"
+ " ( SELECT datediff(WEEK,0, Session.Date) as WeekOffset, Session.SessionAmount, Session.SessionTime"
+ " FROM Session WHERE UserId = @userId "
+ " AND Session.Date >= @startDate AND Session.Date <= @endDate"
+ " ) x"
+ " GROUP BY WeekOffset"
+ " ORDER BY WeekOffset";
SqlParameter start = new SqlParameter("startDate",System.Data.SqlDbType.DateTime);
SqlParameter end = new SqlParameter("endDate", System.Data.SqlDbType.DateTime);
SqlParameter uid = new SqlParameter("userId", System.Data.SqlDbType.VarChar);
List<SqlParameter> paramColl = new List<SqlParameter>();
paramColl.Add(start);
paramColl.Add(end);
paramColl.Add(uid);
List<TempStdDev> Calc = new List<TempStdDev>();
Calc = db.Database.SqlQuery<TempStdDev>(query, paramColl).ToList();
我尝试了几种方法来实现参数,但我不断收到不同的错误消息,例如:>"No mapping exists from object type System.Collections.Generic.List`1...to a known managed provider native type."
最common/standard支持参数查询的方式是什么?
因为SqlQuery的签名是
public DbRawSqlQuery<TElement> SqlQuery<TElement>(
string sql,
params object[] parameters
)
您的代码正在转换为等同于
Calc = db.Database.SqlQuery<TempStdDev>(query, new object[] { paramColl} ).ToList();
将代码更改为
Calc = db.Database.SqlQuery<TempStdDev>(query, paramColl.ToArray<object>()).ToList();
所以函数使用数组本身而不是将列表放在数组的第一个槽中。
但是,因为函数是params
所以你根本不需要使用paramColl
列表,只需要传递成员本身。
Calc = db.Database.SqlQuery<TempStdDev>(query, start, end, uid).ToList();
P.S.
List<TempStdDev> Calc = new List<TempStdDev>();
应该就是
List<TempStdDev> Calc;
你创建一个新列表然后立即覆盖它,第一步没有理由。
我在我当前的项目中使用了 LINQ,但是这个查询在 LINQ 中设计起来似乎很复杂,所以我决定尝试 SQLQuery。
SqlConnection connection = new SqlConnection( db.Database.Connection.ConnectionString );
connection.Open();
string query = "SELECT dateadd(WEEK, x.WeekOffset,0) as [Week],"
+ " AVG(x.SessionAmount * x.SessionTime) as [WeeklyAverage],"
+ " STDEV(x.SessionAmount * x.SessionTime) as [WeeklyStDev],"
+ " FROM"
+ " ( SELECT datediff(WEEK,0, Session.Date) as WeekOffset, Session.SessionAmount, Session.SessionTime"
+ " FROM Session WHERE UserId = @userId "
+ " AND Session.Date >= @startDate AND Session.Date <= @endDate"
+ " ) x"
+ " GROUP BY WeekOffset"
+ " ORDER BY WeekOffset";
SqlParameter start = new SqlParameter("startDate",System.Data.SqlDbType.DateTime);
SqlParameter end = new SqlParameter("endDate", System.Data.SqlDbType.DateTime);
SqlParameter uid = new SqlParameter("userId", System.Data.SqlDbType.VarChar);
List<SqlParameter> paramColl = new List<SqlParameter>();
paramColl.Add(start);
paramColl.Add(end);
paramColl.Add(uid);
List<TempStdDev> Calc = new List<TempStdDev>();
Calc = db.Database.SqlQuery<TempStdDev>(query, paramColl).ToList();
我尝试了几种方法来实现参数,但我不断收到不同的错误消息,例如:>"No mapping exists from object type System.Collections.Generic.List`1...to a known managed provider native type."
最common/standard支持参数查询的方式是什么?
因为SqlQuery的签名是
public DbRawSqlQuery<TElement> SqlQuery<TElement>(
string sql,
params object[] parameters
)
您的代码正在转换为等同于
Calc = db.Database.SqlQuery<TempStdDev>(query, new object[] { paramColl} ).ToList();
将代码更改为
Calc = db.Database.SqlQuery<TempStdDev>(query, paramColl.ToArray<object>()).ToList();
所以函数使用数组本身而不是将列表放在数组的第一个槽中。
但是,因为函数是params
所以你根本不需要使用paramColl
列表,只需要传递成员本身。
Calc = db.Database.SqlQuery<TempStdDev>(query, start, end, uid).ToList();
P.S.
List<TempStdDev> Calc = new List<TempStdDev>();
应该就是
List<TempStdDev> Calc;
你创建一个新列表然后立即覆盖它,第一步没有理由。