如何根据方法参数从 TEntity select 和 return 自定义属性
How to select and return custom properties from a TEntity based on a method parameter
我正在开发针对 .Net 5
和 Entity Framework core
的高级通用存储库。
我正在尝试创建一个方法,该方法将从 TEntity
接收要 selected 的属性,并且此方法应该从 table
和 return object
的 list
它们的结构是一个 Anonymous type
包含要在 parameters
.
中发送的 select 属性
我试过的:
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
实体,我想 select 只是 Student
中的 name
和 city
的列表,我想使用像这样的方法这 :
MyXRepo.GetPartial<Student>(x => x.Name, x => x.City);
希望你能理解,对不起我的英语水平。
我知道这不是正确的方法,所以请帮忙解决这个问题?
恕我直言,我没有太多经验,我不会尝试讨论哪种模式是错的还是好的 :)。
我同意,返回的类型应该 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;
}
再一次,这是我所理解的版本。而且它更灵活一点。取而代之的是属性列表方法获取函数返回对象,无论你是什么类型 want.You 必须添加一些额外的字符(lambda 约定)和转换(如果需要),但你也可以获得强类型对象或创建另一个实现
IEnumerable<TModel> GetPartial<TEntity, TModel>(Func<TEntity, TModel>){...
欢迎任何改进
为什么不改用 OData?这已经是一个定义明确的标准,可以让您完全按照自己的意愿行事。已经有一个可用的库,应该可以很容易地与 entity framework 后端连接,因为它适用于 IQueryable 类型。
我正在开发针对 .Net 5
和 Entity Framework core
的高级通用存储库。
我正在尝试创建一个方法,该方法将从 TEntity
接收要 selected 的属性,并且此方法应该从 table
和 return object
的 list
它们的结构是一个 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
实体,我想 select 只是 Student
中的 name
和 city
的列表,我想使用像这样的方法这 :
MyXRepo.GetPartial<Student>(x => x.Name, x => x.City);
希望你能理解,对不起我的英语水平。
我知道这不是正确的方法,所以请帮忙解决这个问题?
恕我直言,我没有太多经验,我不会尝试讨论哪种模式是错的还是好的 :)。
我同意,返回的类型应该 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;
}
再一次,这是我所理解的版本。而且它更灵活一点。取而代之的是属性列表方法获取函数返回对象,无论你是什么类型 want.You 必须添加一些额外的字符(lambda 约定)和转换(如果需要),但你也可以获得强类型对象或创建另一个实现
IEnumerable<TModel> GetPartial<TEntity, TModel>(Func<TEntity, TModel>){...
欢迎任何改进
为什么不改用 OData?这已经是一个定义明确的标准,可以让您完全按照自己的意愿行事。已经有一个可用的库,应该可以很容易地与 entity framework 后端连接,因为它适用于 IQueryable 类型。