我在 ASP.NET MVC 5 应用程序中使用通用存储库和实体框架(以及数据库优先方法)。
我在“创建通用存储库”(链接)中的 Microsoft 文档的帮助下创建了这个通用存储库。
在存储库中,我们有一个
Get
方法,其中有名为 include 属性的参数,该参数用于预先加载。在此参数中,我以字符串形式传递表名称。
当我需要多个表的数据时,我在表名之间使用逗号来获取它们。
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}.
是否有任何解决方案可以避免使用魔术字符串表名称并使用 lambda 表达式?
如果我理解正确的话,使用这个
params Expression<Func<TEntity, object>>[] navigationProperties
就可以了。请看下面的例子:
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>>? predicate = null,
params Expression<Func<TEntity, object>>[] navigationProperties)
{
IQueryable<TEntity> dbQuery = _dbSet.AsNoTracking();
if (predicate != null)
{
dbQuery = dbQuery.Where(predicate);
}
return navigationProperties.Aggregate(
dbQuery,
(current, navigationProperty) => current.Include(navigationProperty)).ToList();
}