如何使用 iQueryable return 一个空列
How to return an empty column with iQueryable
我有一种方法可以获取按特定字段过滤的用户列表。这种方法对我的应用程序的很多功能很有用,但在其他情况下太慢了。
用户table有一个字段是图片数据,所以是一个重字段。现在我正在开发一个不需要这个字段的功能,我正在寻找方法不要 return 它,或者 return 它为空以简化流程
我正在使用 c#,使用 "GetByFilter" 函数从 UnitOfWork 存储库获取过滤后的用户列表。
UserController.cs
/// <summary>
/// Get by Filter
/// </summary>
/// <param name="filter">user filters</param>
/// <returns></returns>
[Route("functionRoute")]
[HttpPost]
public IHttpActionResult GetUsersByFilter([FromBody] UserFilter filter)
{
try
{
UserService service= new UserService ();
List<User> list = service.GetByFilter(filter).ToList();
List<UserCE> listCE = Mapper.Map<List<UserCE>>(list);
return Ok(listCE);
}
catch (Exception ex)
{
TraceManager.LogError(ex);
return InternalServerError(ex);
}
}
UserService.cs
public List<User> GetByFilter(UserFilter filter)
{
return _unitOfWork.UserRepository.GetByFilter(filter).ToList();
}
UserRepository.cs
public IQueryable<User> GetByFilter(UserFilter filter)
{
return Get_internal(filter);
}
private IQueryable<User> Get_internal(UserFilter filter)
{
IQueryable<User> users = _context.Users;
if (filter.Deleted != null)
{
users = users.Where(u => u.Deleted == filter.Deleted );
}
return users;
}
我稍后尝试清除列,但这个过程仍然太繁重。我怎样才能简化这个过程?
我会像这样更改您的 Get_internal() 函数:
(还没有测试过,我纯粹是凭记忆写的代码,但它应该可以通过一些小的调整来工作)
private IQueryable<User> Get_internal(UserFilter filter)
{
IQueryable<User> users = _context.Users;
if (filter.Deleted != null)
{
users = users.Where(u => u.Deleted == filter.Deleted );
}
return users.Select(x => new User() {
Id = x.Id,
Name = x.Name,
//every property except your image property
});
}
这将为每一行 return 一个新的用户对象,但只会填充您显式 selecting 的属性。因此,如果您不 select 您的图片 属性,则不会 select 编辑。
如果您检查生成的 SQL,您还应该看到此列从未 selected。
按照惯例,所有带有 getter 和 setter 的 public 属性都将包含在模型中。
要排除属性,您需要使用数据注释或 Fluent API
数据注释:
public class User
{
public int Id { get; set; }
[NotMapped]
public string IgnoredField { get; set; }
}
流利API:
public class MyContext : DbContext
{
public DbSet<User> Users{ get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Ignore(b => b.IgnoredField);
}
}
最后,在尝试了一些事情之后,我决定应用 Steven 提出的解决方案,但做了一些小的调整。它在 "Get_Internal" 中出现了问题,所以我决定(虽然这不是最好的选择)在控制器中进行。
代码看起来(或多或少)像这样:
/// <summary>
/// Get by Filter
/// </summary>
/// <param name="filter">user filters</param>
/// <returns></returns>
[Route("functionRoute")]
[HttpPost]
public IHttpActionResult GetUsersByFilter([FromBody] UserFilter filter)
{
try
{
UserService service= new UserService ();
List<User> list = service.GetByFilter(filter).Select(x => new User() {
Id = x.Id,
Name = x.Name,
//every property except your image property
}).ToList();
List<UserCE> listCE = Mapper.Map<List<UserCE>>(list);
return Ok(listCE);
}
catch (Exception ex)
{
TraceManager.LogError(ex);
return InternalServerError(ex);
}
}
我有一种方法可以获取按特定字段过滤的用户列表。这种方法对我的应用程序的很多功能很有用,但在其他情况下太慢了。
用户table有一个字段是图片数据,所以是一个重字段。现在我正在开发一个不需要这个字段的功能,我正在寻找方法不要 return 它,或者 return 它为空以简化流程
我正在使用 c#,使用 "GetByFilter" 函数从 UnitOfWork 存储库获取过滤后的用户列表。
UserController.cs
/// <summary>
/// Get by Filter
/// </summary>
/// <param name="filter">user filters</param>
/// <returns></returns>
[Route("functionRoute")]
[HttpPost]
public IHttpActionResult GetUsersByFilter([FromBody] UserFilter filter)
{
try
{
UserService service= new UserService ();
List<User> list = service.GetByFilter(filter).ToList();
List<UserCE> listCE = Mapper.Map<List<UserCE>>(list);
return Ok(listCE);
}
catch (Exception ex)
{
TraceManager.LogError(ex);
return InternalServerError(ex);
}
}
UserService.cs
public List<User> GetByFilter(UserFilter filter)
{
return _unitOfWork.UserRepository.GetByFilter(filter).ToList();
}
UserRepository.cs
public IQueryable<User> GetByFilter(UserFilter filter)
{
return Get_internal(filter);
}
private IQueryable<User> Get_internal(UserFilter filter)
{
IQueryable<User> users = _context.Users;
if (filter.Deleted != null)
{
users = users.Where(u => u.Deleted == filter.Deleted );
}
return users;
}
我稍后尝试清除列,但这个过程仍然太繁重。我怎样才能简化这个过程?
我会像这样更改您的 Get_internal() 函数: (还没有测试过,我纯粹是凭记忆写的代码,但它应该可以通过一些小的调整来工作)
private IQueryable<User> Get_internal(UserFilter filter)
{
IQueryable<User> users = _context.Users;
if (filter.Deleted != null)
{
users = users.Where(u => u.Deleted == filter.Deleted );
}
return users.Select(x => new User() {
Id = x.Id,
Name = x.Name,
//every property except your image property
});
}
这将为每一行 return 一个新的用户对象,但只会填充您显式 selecting 的属性。因此,如果您不 select 您的图片 属性,则不会 select 编辑。
如果您检查生成的 SQL,您还应该看到此列从未 selected。
按照惯例,所有带有 getter 和 setter 的 public 属性都将包含在模型中。
要排除属性,您需要使用数据注释或 Fluent API
数据注释:
public class User
{
public int Id { get; set; }
[NotMapped]
public string IgnoredField { get; set; }
}
流利API:
public class MyContext : DbContext
{
public DbSet<User> Users{ get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Ignore(b => b.IgnoredField);
}
}
最后,在尝试了一些事情之后,我决定应用 Steven 提出的解决方案,但做了一些小的调整。它在 "Get_Internal" 中出现了问题,所以我决定(虽然这不是最好的选择)在控制器中进行。
代码看起来(或多或少)像这样:
/// <summary>
/// Get by Filter
/// </summary>
/// <param name="filter">user filters</param>
/// <returns></returns>
[Route("functionRoute")]
[HttpPost]
public IHttpActionResult GetUsersByFilter([FromBody] UserFilter filter)
{
try
{
UserService service= new UserService ();
List<User> list = service.GetByFilter(filter).Select(x => new User() {
Id = x.Id,
Name = x.Name,
//every property except your image property
}).ToList();
List<UserCE> listCE = Mapper.Map<List<UserCE>>(list);
return Ok(listCE);
}
catch (Exception ex)
{
TraceManager.LogError(ex);
return InternalServerError(ex);
}
}