首页 > 解决方案 > 如何查询数据库以仅包含 API Json 的搜索元素及其路径?

问题描述

我需要为 net-core/ef-core API 构建一个函数,该函数显示数据库中的一个元素,其中包含指向它的路径中每个对象的数据。

所以,基本上有这样的结构:
许多城市,每个都有一个列表:
一个城市中的多个区域,每个都有一个列表: 区域中的
多个商店,每个报价都有一个列表: 商店中的
多个报价条目,每个都有一个单个变量:
通过外键连接到它的产品。一家商店只能为每个产品提供一个优惠条目(唯一优惠)。所有 DbSet 在下面的第一个代码块(包含)中可见。

我有 2 个变量: string cityNamestring productName.

所以我做了这样的查询:

IQueryable<City> cityNameQuery = _context.Cities
   .Include(x => x.Areas)
       .ThenInclude(x => x.Shops)
           .ThenInclude(x => x.ShopOfferEntries)
              .ThenInclude(x => x.ProductData).Where(x => EF.Functions.Like(x.Name, "%" + cityName + "%")).AsQueryable();

然后做了这样的过滤:

cityNameQuery = cityNameQuery.Where(x => x.Name.Contains(cityName))
   .Where(l => l.Areas.Where(x => x.Shops
   .Where(y => y.ShopOfferEntries
   .Where(z => z.ProductData.Name.Contains(productName)).Any()).Any()).Any());

然后将其收集到一个列表并返回:

if (pricesByCity == null || pricesByCity.Count() == 0)
   {
      return Json("Product not available in this city.");
   }       
pricesByCity = cityNameQuery.ToList();
return Json(pricesByCity);

结果要么显示“该城市没有产品”,要么显示整个城市的所有区域、所有商店及其所有报价,包括报价中其他产品的数据。但并不需要所有这些数据。

Json API 应该打印的内容是:

  1. 拥有产品面积的城市
  2. 该区域应仅显示拥有该产品的商店
  3. 该商店应仅显示产品的报价
  4. 该报价应仅显示产品的数据
  5. 产品数据本身。

所以我们可能需要去掉列表中的其他元素,因为每个城市都有很多区域,区域有很多商店等,我们应该只显示那些导致所寻找产品的元素。

以为我可以过滤掉客户端的 json 结果,但这不是一个明智的解决方案。
是否有任何快速、集成的方法来仅显示数据库中项目的路径?
我们如何更改上面的代码以最有效地做到这一点?或者也许我应该重组数据库以获得这样的结果?

标签: c#asp.netjsonentity-framework.net-core

解决方案


推荐阅读