Tôi có đoạn mã sau:Entity Framework 4.1: Không thể đúc từ DbQuery để ObjectQuery
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());
}
Về cơ bản, những gì tôi đang cố gắng làm là để xóa một số lượng lớn các dữ liệu từ một ngữ cảnh (có được một truy vấn kết quả, lấy SQL và thực hiện nó). Nhưng tôi gặp sự cố khi truyền result
đến ObjectQuery
. Trường hợp ngoại lệ cho phép là
Không thể cast đối tượng kiểu 'System.Data.Entity.Infrastructure.DbQuery
1[System.Int32]' to type 'System.Data.Objects.ObjectQuery
1 [System.Int32]'.
Ai có thể đưa ra bất kỳ gợi ý nào để giải quyết vấn đề này không? Cảm ơn!
EDIT: Ladislav giải pháp đầu tiên giúp tôi giải quyết vấn đề, nhưng nó happenned một vấn đề nhỏ với các thông số SQL của truy vấn SQL được tạo ra, tức là truy vấn SQL được tạo ra bởi query.ToString()
là thế này:
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))
Vấn đề là các biến số @p__linq__0
và @p__linq__1
không được khai báo và do đó truy vấn đã đưa ra lỗi "Phải khai báo biến vô hướng @p_ linq _0" (tôi chắc chắn nó sẽ cho cùng một lỗi cho biến @p__linq__1
). Để "khai báo" chúng tôi cần chuyển chúng làm đối số của ExecuteSqlCommand()
. Và như vậy, giải pháp cuối cùng cho câu trả lời đầu tiên là mã dưới đây:
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)
);
}
Bằng cách này, tôi giả sử các biến được tạo ra luôn có định dạng @p__linq__
, trừ khi Entity Framework Đội bóng của Microsoft thay đổi nó trong bất kỳ bản cập nhật EF tương lai. ..
cảm ơn sự giúp đỡ của bạn! Kiểm tra chỉnh sửa bài đăng của tôi (tôi đã thêm giải pháp cuối cùng) vì nó đã gặp phải một vấn đề nhỏ với các tham số SQL. Dù bằng cách nào, nó được giải quyết! :) – jmpcm