代码之家  ›  专栏  ›  技术社区  ›  Yanayaya

如何根据使用数组传递给kendo网格的id在mvc应用程序中返回数据?

  •  0
  • Yanayaya  · 技术社区  · 6 年前

    我想将一个id数组传递给我的控制器,并只将具有匹配id的记录返回给我的kendo网格。

    这是我目前所拥有的,我的javascript函数和一个基本数组。

    var cars = [1,2,3];
    function myParams() {
        return {
            array: cars
        }
    }
    

    这是我的控制器。

    private UnitOfWork unitOfWork = new UnitOfWork();
    
    public ActionResult GetTabCars(int[] array, [DataSourceRequest] DataSourceRequest request)
    {
        var car = unitOfWork.CarRepository.Get().Where(u => array.Any(x => x == u.Id));
            var result = car.ToDataSourceResult(request);
            return Json(result, JsonRequestBehavior.AllowGet);        
    }
    

    我的工作单元是一个通用存储库。这是 Get 我从 GenericRepository.cs

    public virtual IEnumerable<TEntity> Get(
                Expression<Func<TEntity, bool>> filter = null,
                Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
                string includeProperties = "")
            {
                IQueryable<TEntity> query = dbSet;
    
                if (filter != null)
                {
                    query = query.Where(filter);
                }
    
                foreach (var includeProperty in includeProperties.Split
                    (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    query = query.Include(includeProperty);
                }
    
                if (orderBy != null)
                {
                    return orderBy(query).ToList();
                }
                else
                {
                    return query.ToList();
                }
            }
    

    因为身份证是 int 我不能用 .Contains 是的。虽然我的controller方法没有报告任何错误,但是我的网格中没有数据。我做错什么了吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Sumit raj    6 年前

    你的代码有问题

    var car = unitOfWork.CarRepository.Get().Where(u => array.Any(x => x == u.Id));
    

    您正在查询列表( unitOfWork.CarRepository.Get() )这将始终导致计数0,因为参数尚未通过),所以它永远不会给您结果。

    我也不确定应该传递什么表达式,但有一个解决方法。也许有人会给你一个更好的答案,但在你没找到答案之前,你可能会用到它。

    在您的存储库中 必须有一个方法来获取单个记录 FindSingleOrDefault() .如果 FindSingleOrDefault() 是不是你可以粘贴这个代码

    public TEntity FindSingleOrDefault(Expression<Func<TEntity, bool>> predicate)
            {
                return _context.Set<TEntity>().SingleOrDefault(predicate);
            }
    

    所以你可以用这个。

    List<Car> cars=new List<Car>();
    foreach(var id in array)
    {
      cars.Add(unitOfWork.CarRepository.FindSingleOrDefault(x=>x.id==id));
    }
    

    Cars 将包含具有匹配ID的所有汽车记录。

    如果不是存储库模式 那么简单的linq查询应该是

    var cars = (from id in array
                join car in dbSet.Cars
                on id equals car.id
                select car).ToList();
    

    如果你在应用这个答案时遇到问题,请告诉我。