Вызов FromSql Не работает с IQueryable‹TEntity› после миграции с ядра Entity Framework 2.2 на 3.0

Я создаю свой запрос динамически, у меня есть метод, который получает IOrderedQueryable<T>, который является необязательным. Раньше этот код отлично работал с EF Core 2.2, но перестал работать после миграции.

IQueryable<T> query;

if (spec.OrderedQueryable == null)
{
    query = DbContext.Set<T>()
                     .FromSqlRaw($"SELECT * FROM {tableName} WHERE RowVersion > @p0", new[] { lastRowVersion });
}
else
{
    query = spec.OrderedQueryable;
    query = query.FromSql($"SELECT * FROM {tableName} WHERE RowVersion > @p0", new[] { lastRowVersion });
}

В документах сказано, что FromSql заменено на FromSqlRaw, это правда, что это работает на DbSet, но не на IQueryable<T>. Любые намеки на то, как я могу добиться этого с помощью EF Core 3.0?


person Mozart Al Khateeb    schedule 06.10.2019    source источник


Ответы (2)


Как я получил это из документа в ef core 3.0, вы не можете этого сделать.

До EF Core 3.0 метод FromSql можно было указать в любом месте запроса.

Новое поведение

Начиная с EF Core 3.0, новые методы FromSqlRaw и FromSqlInterpolated (которые заменяют FromSql) можно указывать только в корнях запроса, то есть непосредственно в DbSet‹>. Попытка указать их где-либо еще приведет к ошибке компиляции.

Почему

Указание FromSql где-либо, кроме DbSet, не имело дополнительного значения или дополнительной ценности и могло вызвать двусмысленность в определенных сценариях.

Смягчение

Вызовы FromSql должны быть перемещены непосредственно в DbSet, к которому они применяются.

person evilGenius    schedule 06.10.2019
comment
Неверно для моего случая. Указание FromSql где-либо, кроме как в DbSet, не имеет дополнительного смысла или дополнительной ценности, хотя это не самый чистый код, но он избавляет меня от написания тонны методов, просто передавая запрос () в качестве параметра. - person Mozart Al Khateeb; 06.10.2019

Вы не можете использовать интерполяцию ($) с FromSqlRaw(), вместо этого замените ее на .FromSqlRaw("SELECT * FROM @tableName WHERE RowVersion > @p0", tablename,p0 })

person Saiteja Prattipati    schedule 21.05.2020