通用存储库和 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/