在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);
}
}
发布于 2017-05-12 12:23:49
尽管我在这篇文章上发表了评论,但我想我应该在这里给出一个答案,它可以编译。由于我不理解用例,所以很难找到合适的解决方案。这里是代码
public class PersonBusiness<T> : BaseBusiness<T> where T: PersonEntity
{
public IQueryable<T> GetQuery(string orderBy, int? groupId)
{
IQueryable<T> query = Db.Set<T>();
Func<IQueryable<T>, IQueryable<T>> 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<T> ApplyDefaultOrderyBy(IQueryable<T> query)
{
return query.OrderBy(q => q.FullName);
}
}
根据@Ivan的评论,更新后使用DbSet来支持Cast。
发布于 2017-05-03 10:23:34
我将PersonEntity提取到一个接口中,并使用类型约束来要求T实现IPersonEntity。我不明白您在做什么,但是您似乎想使用类型约束,只是以前没有听说过它们。
https://msdn.microsoft.com/en-us/library/d5x73970.aspx
public interface IPersonEntity
{
int Id { get; set; }
string FullName { get; set; }
}
public class PersonBusiness<T> where T : IPersonEntity
{
public IQueryable<T> GetQuery(string orderBy, int? groupId)
{
IQueryable<T> query = Db.PersonSet;
Func<IQueryable<T>, IQueryable<T>> 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 IQueryable<T> ApplyDefaultOrderyBy(IQueryable<T> query)
{
return query.OrderBy(q => q.FullName);
}
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;
}
}
https://stackoverflow.com/questions/43763569
复制