在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);
}
}
究竟是什麼問題,你有? – mclark1129
它不編譯,不相容性的IQueryable和IQueryable的之間。鑄造可以解決它,但在這種情況下有很多鑄件,因此它有氣味。我認爲它應該有不同的設計。 –
lockedscope
你的文章的標題是通用的。 – niksofteng