gpt4 book ai didi

c# - Entity Framework 4.1 : Unable to cast from DbQuery to ObjectQuery

转载 作者:IT王子 更新时间:2023-10-29 04:49:03 28 4
gpt4 key购买 nike

我有以下代码:

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 时遇到了问题。给出的异常是

Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery1[System.Int32]' to type
'System.Data.Objects.ObjectQuery
1[System.Int32]'.

任何人都可以给出任何提示来解决这个问题吗?谢谢!

编辑: Ladislav 第一个解决方案帮我解决了这个问题,但是生成的 SQL 查询的 SQL 参数发生了一点问题,即 query.ToString( ) 是这样的:

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 的 Entity Framework 团队在未来的任何 EF 更新中更改它...

最佳答案

那是因为你的_database源自 DbContext和你的 AccountsOfMonthDbSet<> .在这种情况下,您不能使用 ObjectQuery直接因为DbSet<>生产 DbQuery<>不能转换为 ObjectQuery<> .

您必须使用 DbQuery<>直接:

var result = from acm in this._database.AccountsOnMonth
where ((acm.Year == year) && (acm.Month == month))
select acm.Id;
var query = (DbQuery<int>)result;

string sql = string.Format(
"DELETE FROM [AccountsOnMonth] WHERE [AccountsOnMonth].[Id] IN ({0})",
query.ToString()
);

或者您必须先将上下文转换为 ObjectContext并创建 ObjectSet<> :

var objectContext = ((IObjectContextAdapter)_database).ObjectContext;
var set = objectContext.CreateObjectSet<AccountsOnMonth>();
var resut = from acm in set
where ((acm.Year == year) && (acm.Month == month))
select acm.Id;

第一种方法的问题是 DbQuery不提供 Parameters集合 - 只是 DbContext API 中简化的另一个例子,只会让它更难使用。

关于c# - Entity Framework 4.1 : Unable to cast from DbQuery to ObjectQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7208709/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com