参数化的SQLQuery

时间:2015-09-04 18:40:09

标签: c# sql-server entity-framework query-parameters

我在我当前的项目中使用过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();  

我已经尝试了几种方法来实现参数,但我不断收到不同的错误消息,例如:&gt;“从对象类型System.Collections.Generic.List`1 ...到已知的托管提供者本机类型不存在映射。“

支持查询参数的最常用/标准方法是什么?

1 个答案:

答案 0 :(得分:2)

因为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;

您创建一个新列表然后立即覆盖它,没有理由第一步。