Where子句未包含在SQL查询中

时间:2015-11-18 12:30:41

标签: c# .net sql-server entity-framework-6

我目前正在使用EntityFramework 6.0在C#4.0中创建一个应用程序。

我试图从数据库中检索项目列表,但问题是EF框架生成的SQL查询不包含where子句。

因此,整个表/视图都会加载到内存中,只需要10秒即可获得2或3个项目。

下面是我的GenericRepostitory中的方法:

public IList<TEntity> GetList(Func<TEntity, bool> where, params Expression<Func<TEntity, object>>[] navigationProperties)
{
    using (var dbContextScope = contextScopeFactory.CreateReadOnly())
    {
        IQueryable<TEntity> dbQuery = Context.Set<TEntity>().AsQueryable();

        foreach (Expression<Func<TEntity, object>> navigationProperty in navigationProperties)
            dbQuery = dbQuery.Include<TEntity, object>(navigationProperty);

        var list = dbQuery
            .AsNoTracking()
            .Where(where);

        Context.Database.Log = s => Debug.WriteLine(s);

        return list.ToList<TEntity>();
    }
}

我称之为:

var repository = repositoryFactory.Get<Context, Entity>();
var items = repository.GetList(x => x.FakeID <= 10); 

返回结果很好,但需要大约10秒才能检索到。 当调试写入生成的SQL查询时,where子句无处可用

如何修改我的函数GetList以包含where子句?

我希望我对这些信息足够清楚,对不起我的英语。 它不是我的母语:/

无论如何,谢谢你的帮助

2 个答案:

答案 0 :(得分:6)

更改方法签名
GetList(Func<TEntity, bool> where, ...

GetList(Expression<Func<TEntity, bool>> where, ...

你仍然可以像现在一样用lambda来调用它。 Where用作&#34; linq-to-objects&#34;,在从数据库读取的完整列表中。使用Expression EF可以读取它以生成所需的sql。

答案 1 :(得分:6)

where参数的类型为Func<TEntity, bool>,因此

dbQuery.Where(where)

使用Enumerable.Where扩展方法,在过滤之前将数据加载到内存中。如果要使用Queryable.Where方法(将转换为SQL),则需要Expression<Func<TEntity, bool>>参数

public IList<TEntity> GetList(Expression<Func<TEntity, bool>> where, 
                              params Expression<Func<TEntity, object>>[] navigationProperties)