假设我有以下的(用于显示在下拉列表中的项目):可重复使用的逻辑查询
class SelectItemViewModel<TId>
{
string Name {get; set;}
TId Id {get; set;}
}
以及这对我的数据库实体:
interface IEntity<TId>
{
TId Id {get;
}
我希望能够重复使用逻辑来创建这些下拉项目,并传入一些名称。例如,现在我已经(简化):
List<SelectItemViewModel<int>> GetAvailableEntity1Items(IQuerable<Entity1> entities)
{
return entities
.Select(e => new SelectItemViewModel<int>
{
Id = e.Id,
Name = e.Title
})
.ToList();
}
List<SelectItemViewModel<short>> GetAvailableEntity2Items(IQuerable<Entity2> entities)
{
return entities
.Select(e => new SelectItemViewModel<short>
{
Id = e.Id,
Name = e.Description
})
.ToList();
}
它们显然具有相同的基本结构。我想在IEntity<T>
上运行并传入“get name”函数,但我无法使它与Entity Framework一起工作。
不起作用:
List<SelectItemViewModel<TId> GetAvailableItems<TEntity, TId>(IQueryable<TEntity> entitiesQuery, Func<TEntity, string> getNameForEntity)
where TEntity : class, IEntity<TId>
{
return entitiesQuery
.Select(e => new SelectItemViewModel<TId>
{
Id = e.Id,
Name = getNameForEntity(e)
}
}
,我不知道我是怎么想实现
List<SelectItemViewModel<TId> GetAvailableItems<TEntity, TId>(IQueryable<TEntity> entitiesQuery, Expression<Func<TEntity, string>> getNameForEntity)
where TEntity : class, IEntity<TId>
{
return entitiesQuery
.Select(e => new SelectItemViewModel<TId>
{
Id = e.Id,
Name = ??
}
}
有没有办法在这里重用逻辑是什么?我能想到的另一件事是另一个接口,例如IHasName
来获取名称,但坦率地说,我不希望数据库实体负责指示它们应该如何显示在UI层。
是的,这是真的,这是我正在考虑另一种方法(但我想,以避免它,因为我真正需要的是编号和名称) –