【问题标题】:How to return an empty column with iQueryable如何使用 iQueryable 返回一个空列
【发布时间】:2019-12-25 09:58:19
【问题描述】:

我有一种方法可以获取按特定字段过滤的用户列表。这种方法对我的应用程序的很多功能都很有用,但在其他情况下太慢了。

用户的表有一个字段,里面有图片的数据,所以字段很重。现在我正在开发一个不需要这个字段的功能,我正在寻找不返回它的方法,或者将它作为空返回以简化流程

我正在使用 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;
        }

我稍后尝试清除列,但过程仍然过于繁重。我怎样才能简化这个过程?

【问题讨论】:

  • this SO 问题的可能重复项。

标签: c# filter repository iqueryable unit-of-work


【解决方案1】:

我会像这样更改您的 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
                });
        }

这将为每一行返回一个新的用户对象,但只会填充您明确选择的属性。因此,如果您不选择您的图像属性,这将不会被选中。

如果您检查生成的 SQL,您还应该看到该列从未被选中。

【讨论】:

    【解决方案2】:

    按照惯例,所有带有 getter 和 setter 的公共属性都将包含在模型中。

    要排除属性,您需要使用 Data Annotations 或 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);
        }
    }
    

    【讨论】:

    • @Excali 2 我的回答最终帮您解决了问题吗?
    【解决方案3】:

    Finnaly 在尝试了一些事情之后,我决定应用 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);
                }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      相关资源
      最近更新 更多