实体框架将where子句附加到SqlQuery调用

时间:2018-09-12 18:57:38

标签: c# entity-framework entity-framework-6

我有以下原始查询是通过SqlQuery上的DbSet调用通过Entity Framework执行的:

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表达式转换为可以手动附加的查询(也就是,无需手动编写SQL查询,where子句并不总是那么简单)?

1 个答案:

答案 0 :(得分:2)

这不能用LINQ方法完成,因为“原始”查询的类型为DbRawSqlQuery<TElement>,而缺少使用Where“组成”动态查询所需的支持。

如果您希望对项目进行计数,则可以通过以下条件解决该问题:

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