【发布时间】:2011-08-26 17:55:33
【问题描述】:
我有以下代码:
public void DeleteAccountsForMonth(int year, int month)
{
var result = from acm in this._database.AccountsOnMonth
where ((acm.Year == year) && (acm.Month == month))
select acm.Id;
var query = (ObjectQuery<int>)result;
string sql = string.Format(
"DELETE FROM [AccountsOnMonth] WHERE [AccountsOnMonth].[Id] IN ({0})",
query.ToTraceString()
);
var parameters = new List<System.Data.SqlClient.SqlParameter>();
foreach (ObjectParameter parameter in query.Parameters)
{
parameters.Add(new System.Data.SqlClient.SqlParameter {
ParameterName = parameter.Name,
Value = parameter.Value
});
}
this._database.Database.ExecuteSqlCommand(sql, parameters.ToArray());
}
基本上,我要做的是从上下文中删除大量数据(获取查询结果,获取 SQL 并执行它)。但是在将result 转换为ObjectQuery 时遇到问题。给出的例外是
无法转换类型的对象 'System.Data.Entity.Infrastructure.DbQuery
1[System.Int32]' to type 'System.Data.Objects.ObjectQuery1[System.Int32]'。
任何人都可以给出任何提示来解决这个问题吗?谢谢!
编辑: Ladislav 第一个解决方案帮我解决了这个问题,但是生成的 SQL 查询的 SQL 参数发生了一点问题,即query.ToString() 生成的 SQL 查询是这样的:
DELETE FROM [SncAccountOnMonths] WHERE [SncAccountOnMonths].[Id] IN (
SELECT [Extent1].[Id] AS [Id]
FROM [dbo].[SncAccountOnMonths] AS [Extent1]
WHERE ([Extent1].[Year] = @p__linq__0) AND ([Extent1].[Month] = @p__linq__1))
问题是变量@p__linq__0 和@p__linq__1 没有声明,所以查询给出了错误“必须声明标量变量@p_linq_0”(我确定它会给出变量@p__linq__1 的错误相同)。要“声明”它们,我需要将它们作为ExecuteSqlCommand() 的参数传递。因此,初始答案的最终解决方案是以下代码:
public void DeleteAccountsForMonth(int year, int month)
{
var result = (this._database.AccountsOnMonth
.Where(acm => (acm.Year == year) && (acm.Month == month)))
.Select(acm => acm.Id);
var query = (DbQuery<int>)result;
string sql = string.Format(
"DELETE FROM [AccountsOnMonth] WHERE [AccountsOnMonth].[Id] IN ({0})",
query.ToString()
);
this._database.Database.ExecuteSqlCommand(sql,
new SqlParameter("p__linq__0", year),
new SqlParameter("p__linq__1", month)
);
}
顺便说一句,我假设生成的变量始终具有 @p__linq__ 格式,除非 Microsoft 的实体框架团队在未来的任何 EF 更新中更改它...
【问题讨论】:
标签: c# entity-framework ef-code-first