【发布时间】:2017-10-01 11:50:10
【问题描述】:
在PersonBusiness.GetQuery 方法中,PersonEntity 遍布代码,还有许多其他实体类型将类似地实现此方法。
我想在 PersonBusiness 中使用泛型参数来减少对特定实体类型的使用,因为会有这样的实现与其他实体一起使用,我想防止使用其他类型而不是预期的实体类型。但不能成功或满足泛型参数使用的版本。
如果更有意义的话,我也想使用接口而不是具体的类。
public class Entities: DbContext
{
public virtual DbSet<PersonEntity> PersonSet { get; set; }
}
public class PersonEntity
{
public int Id { get; set; }
public string FullName { get; set; }
}
public class BaseBusiness
{
public Entities Db => new Entities();
}
public abstract class BaseBusiness<T> : BaseBusiness where T : class
{
public IQueryable<T> GetQuery<TKey>(Expression<Func<T, bool>> where,
Expression<Func<T, TKey>> orderBy)
{
IQueryable<T> query = Db.Set<T>();
if (where != null)
query = query.Where(where);
if (orderBy != null)
query = query.OrderBy(orderBy);
return query;
}
public abstract IQueryable<T> ApplyDefaultOrderyBy(IQueryable<T> query);
public IQueryable<T> GetQuery(IQueryable<T> query, string orderBy, Func<IQueryable<T>, IQueryable<T>> defaultOrderBy = null)
{
if (orderBy != null)
query = query.OrderBy(orderBy);
else
query = defaultOrderBy != null ? defaultOrderBy(query) : ApplyDefaultOrderyBy(query);
return query;
}
}
public class PersonBusiness : BaseBusiness<PersonEntity>
{
public IQueryable<PersonEntity> GetQuery(string orderBy, int? groupId)
{
IQueryable<PersonEntity> query = Db.PersonSet;
Func<IQueryable<PersonEntity>, IQueryable<PersonEntity>> defaultOrderBy = null;
if (groupId.HasValue)
{
query = query.Where(d => d.Id == groupId);
}
else
{
defaultOrderBy = q => q.OrderBy(d => d.Id).ThenBy(d => d.FullName);
}
return GetQuery(query, orderBy, defaultOrderBy);
}
public override IQueryable<PersonEntity> ApplyDefaultOrderyBy(IQueryable<PersonEntity> query)
{
return query.OrderBy(q => q.FullName);
}
}
【问题讨论】:
-
您到底遇到了什么问题?
-
无法编译,IQueryable
和 IQueryable 不兼容。施法解决了它,但在这种情况下有很多施法,所以它闻起来很臭。我认为它应该设计不同。 -
您的代码看起来像存储库反模式。考虑不同的设计。您的
BaseBusiness<T>课程要解决什么问题?它究竟封装了什么? -
这些 GetQuery 和 ApplyDefault 函数似乎没有任何价值。对于可以通过 1 行 Linq 语句直接针对 DbSet 执行的操作,该逻辑基本上是多余的。如果我是你,我会考虑完全忽略它们,而是尝试直接针对 DbSet 编写 Linq,看看会是什么样子。我敢打赌你最终会从你的代码中删除这些“GetQuery”结构。
-
您的问题过于宽泛、不清楚且基于选项,无论是否有赏金。
标签: c# entity-framework linq oop generics