问题描述
我正在开发一个针对 .Net 5
和 Entity Framework core
的高级通用存储库。
我正在尝试创建一个方法来接收要从 TEntity
中选择的属性,并且该方法应该从 table
中获取这些属性并返回 list
的 { {1}} 的结构是一个 object
,其中包含要在 Anonymous type
中发送的要选择的属性。
我尝试了什么:
parameters
这个方法的最终用途是什么:
让我们想象一下我们有一个 public virtual object GetPartial<TEntity> ( params Expression<Func<TEntity,object>>[] propertiesToBeSelected )
{
var result = (from x in Context.Set<TEntity>() select propertiesToBeSelected).ToList();
return result;
}
实体,我只想从 Student
中选择 name
和 city
的列表,我想使用这样的方法:>
Student
希望你能理解,抱歉我的英语水平。
解决方法
恕我直言,我没有很多经验,我不会尝试讨论哪种模式是错误的或好的:)
我同意,返回类型应该是 List<object>
而不是对象本身,我更喜欢将这种逻辑添加到扩展中。
我已经测试了这段代码,自己试试看是否合适(当然,忽略控制器类型)
public IActionResult Test()
{
var result = myService.GetPartial<Company>(x=> new { x.Name1,x.Notes});
return Ok();
}
和实现
public IEnumerable<object> GetPartial<T>(Func<T,object> selector)
where T:class
{
var t = DbContext.Set<T>().Select(selector).ToList();
return t;
}
再一次,这是我理解的版本。它更灵活一点。取而代之的是属性列表获取函数返回对象的任何类型。您必须添加一些额外的字符(lambda 约定)和强制转换(如果需要),但您也可以获取强类型对象或创建另一个实现
IEnumerable<TModel> GetPartial<TEntity,TModel>(Func<TEntity,TModel>){...
欢迎任何改进
,为什么不改用 OData?这已经是一个定义明确的标准,可以让您完全按照自己的意愿行事。已经有一个可用的库,并且应该可以轻松地与实体框架后端连接,因为它适用于 IQueryable 类型。