如何使用 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);
            }
}