Entity Framework добавляет предложение where к вызову SqlQuery - PullRequest
0 голосов
/ 12 сентября 2018

У меня следующий необработанный запрос, выполняемый через Entity Framework через SqlQuery вызов DbSet:

public IEnumerable<TEntity> GetComplicatedData<TEntity>()
{
    return database
        .Set<TEntity>()
        .SqlQuery("SELECT * FROM <Complicated Query Here>");
}

...

var count = GetComplicatedData<Item>()
    .Where(f => f.OwnerID == 5)
    .Count();

Это работает, но очень медленно из-за того, что SqlQuery выполняется немедленно без применения Where.

Есть ли способ вызвать SqlQuery таким образом, чтобы Where был применен на стороне сервера?

По сути, я хочу, чтобы Entity Framework генерировал запрос хранилища, например:

SELECT 
    <Columns> 
FROM 
(
    SELECT * FROM <Complicated Query Here>
) a
WHERE a.OwnerID = 5

Или, есть ли способ перевести мое выражение where в запрос, который я могу добавить вручную (a.k.a, без написания запроса SQL вручную, предложение where не всегда так просто)?

1 Ответ

0 голосов
/ 12 сентября 2018

Это невозможно сделать с помощью методов LINQ, поскольку «необработанные» запросы имеют тип DbRawSqlQuery<TElement>, в котором отсутствует поддержка, необходимая для «составления» динамических запросов с Where.

Если вы заинтересованы в подсчете предметов, вы можете обойти эту проблему, выполнив условие:

public int CountComplicatedData<TEntity>(Func<TEntity,bool> condition) {
    return database
        .Set<TEntity>()
        .SqlQuery("SELECT * FROM <Complicated Query Here>")
        .Count(condition);
}
...