c# - Entity Framework 通用存储库与上下文直接查询

标签 c# sql-server entity-framework repository-pattern

通用存储库和 Entity Framework : 我计划使用通用存储库来处理上下文查询,并注意到(使用 SQL 服务器探查器)过滤器表达式没有被翻译并包含在对数据库的 SQL 查询中。只是想知道在使用通用存储库时是否会出现这种过载? 存储库代码:

public class BaseRepositories<TEntity> where TEntity : class
{

    private readonly DbContext _CurrentObjectContext;
    private readonly DbSet<TEntity> _EntityObjectSet;

    public BaseRepositories(DbContext currentObjectContext)
    {
        _CurrentObjectContext = currentObjectContext;
        _EntityObjectSet = _CurrentObjectContext.Set<TEntity>();
    }

    public DbSet<TEntity> EntityObjectSet
    {
        get
        {
            return _EntityObjectSet;
        }
    }

    public IQueryable<TEntity> Query(Func<TEntity, bool> expression, params Expression<Func<TEntity, object>>[] navigationProperties)
    {
        var ReturnSetQueryable = _EntityObjectSet.Where(expression);
        return ReturnSetQueryable.AsQueryable();
    }

}

对存储库和上下文的调用以及来自探查器的 SQL 查询 a) 使用存储库:

代码:

        var UserRepository = new BaseRepositories<user>(new DbContext());


        var UsersQuery = UserRepository.Query(v => v.name == "ajayr");

        var FirstUser = UsersQuery.FirstOrDefault();

从 Sql Profiler 查询:

选择 [Extent1].[guid] AS [guid], [Extent1].[id] AS [id], [Extent1].[名称] AS [名称], [Extent1].[密码] AS [密码], [Extent1].[first_name] AS [first_name], [Extent1].[middle_name] AS [middle_name], [Extent1].[last_name] AS [last_name], [Extent1].[email_address] AS [email_address], [Extent1].[url] AS [url], [Extent1].[account_enabled] AS [account_enabled], [Extent1].[user_id] AS [user_id], [Extent1].[last_update] AS [last_update], [Extent1].[删除] AS [删除], [Extent1].[employee_id] AS [employee_id], [Extent1].[rec_source] AS [rec_source], [Extent1].[last_login_date] AS [last_login_date], [Extent1].[last_email_update] AS [last_email_update], [Extent1].[invalid_email_adr] AS [invalid_email_adr] FROM [dbo].[users] AS [Extent1]

b) 直接查询上下文:

代码:

       DbContext db = new DbContext();

        DbSet<user> usersset = db.Set<user>();

       var UserQueryWithFilter =  usersset.Where(v => v.name == "ajayr");

       var FirstUser = tesst.FirstOrDefault();

从 Sql Profiler 查询:

选择顶部 (1) [Extent1].[guid] AS [guid], [Extent1].[id] AS [id], [Extent1].[名称] AS [名称], [Extent1].[密码] AS [密码], [Extent1].[first_name] AS [first_name], [Extent1].[middle_name] AS [middle_name], [Extent1].[last_name] AS [last_name], [Extent1].[email_address] AS [email_address], [Extent1].[url] AS [url], [Extent1].[account_enabled] AS [account_enabled], [Extent1].[user_id] AS [user_id], [Extent1].[last_update] AS [last_update], [Extent1].[删除] AS [删除], [Extent1].[employee_id] AS [employee_id], [Extent1].[rec_source] AS [rec_source], [Extent1].[last_login_date] AS [last_login_date], [Extent1].[last_email_update] AS [last_email_update], [Extent1].[invalid_email_adr] AS [invalid_email_adr] FROM [dbo].[users] AS [Extent1] WHERE 'ajayr' = [Extent1].[名称]

最佳答案

您提供函数,而不是表达式作为参数。我认为你需要稍微改变一下语法

public IQueryable<TEntity> Query(Expression<Func<TEntity, bool>> expression, params Expression<Func<TEntity, object>>[] navigationProperties)
{
    var ReturnSetQueryable = _EntityObjectSet.Where(expression);
    return ReturnSetQueryable.AsQueryable();
}

关于c# - Entity Framework 通用存储库与上下文直接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22080116/

相关文章:

wpf - Datagrid SelectedItem 在 window.IsEnabled = false 上丢失

sql-server - SQL Server 配置管理器 Express 2012

c# - 如何使用 Entity Framework 根据最大版本选择多条记录

c# - 在具有端点路由的 ASP.NET Core 中使用 CreatedAtRouteResult 生成带有段的 URL

c# - 如果 child 没有 parent 就不能存在,那么 child 的 parent 引用是否合理?

c# - 如何过滤 SQL Server 中所有现有存储过程的输出?

sql-server - SQL 统计信息和索引 - 它们有多详细?

c# - EF LINQ 查询 if 子句中抛出空引用异常

c# - 为什么我不应该实现 IObservable<T>?

c# - Linq/XML - 你如何处理不存在的节点?