Entity Framework 4.1: невозможно преобразовать из 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());
}

В основном я пытаюсь сделать следующее: удалить большой объем данных из контекста (получить результат запроса, получить SQL и выполнить его). Но у меня возникла проблема при преобразовании результата в ObjectQuery . Исключение, которое дает равно

Невозможно привести объект типа "System.Data.Entity.Infrastructure.DbQuery 1 [System.Int32]" для ввода 'System.Data.Objects.ObjectQuery 1 [System.Int32]'.

Кто-нибудь может подсказать, как решить эту проблему? Спасибо!

РЕДАКТИРОВАТЬ: Первое решение Ладислава помогло мне решить проблему, но возникла небольшая проблема с параметрами SQL сгенерированного 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 ...

18
задан jmpcm 27 August 2011 в 23:28
поделиться