我有多个基于给定过滤器显示数据的网格(在使用REST Api的Web应用程序中)。显示的数据结构始终相同(以简化问题),但根据用户所在的屏幕,显示的结果会有所不同。
此外,这是问题,必须禁用某些结果,以便用户无法选择它们。
示例:Foo有N条。如果我想向父亲(foo)添加一个新的子(bar),我会进入搜索屏幕,但我希望过滤的网格显示为已经与父亲相关的残疾儿童。
目前,我通过执行细节连接来控制服务器(数据库查询)上的此问题,具体取决于方案和"禁用"结果我不想要。但是这种方法导致我无法重用查询(由于特定的连接。也许我需要搜索Bars int order将它们与其他父亲Baz联系起来,我想要禁用已经与当前父亲相关的条...)
另一种方法可能如下:
在开始实施此解决方案之前,我想知道是否有更好的选择。 我确定这是一个反复出现的问题,我不想重新发明轮子。
任何策略或建议?
编辑:show example:
假设这个模型:
Category N:M Item
SalesPromotion N:M Item
我有两个不同的屏幕:一个显示项目属于一个类别,另一个显示项目属于一个促销。在每个屏幕中,我都可以搜索项目并将它们添加到Category或SalesPromotion中。但是,当我搜索项目时,我希望已经属于Category / SalesPromotion的项目显示为已禁用(或者为了简单起见未在此示例中显示)。 我可以在服务器中执行此操作,执行以下查询:
-- Query for search Items in Category screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsCategories ic on ic.ItemId = i.ItemId
WHERE ic.CategoryId IS NULL OR ic.CategoryId <> @CurrentCategoryId
-- Query for search Items in SalesPromotion screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsSalesPromotions isp on isp.ItemId= i.ItemId
WHERE isp.PromotionId IS NULL OR isp.PromotionId <> @CurrentPromotionId
你可以想象如果我有越来越多这样的场景会发生什么(当然会有更复杂的模型和查询)。
一种替代方案可能是:
所以,我的问题是这种方法是一个很好的解决方案,还是有一个众所周知的解决方案(我认为是这样)。
答案 0 :(得分:6)
我根据操作评论
更改了答案所以你基本上有两个选择。
答案 1 :(得分:3)
在SELECT
中,LEFT JOIN
部分无用。您的WHERE
子句仅使用ITEMS
表,因此它对返回的行集没有影响,并且由于另一个表没有相应的行,因此该另一个表的列都是{{1 }}
您可以拥有一个NULL
(+过滤器)并根据SELECT * FROM ITEMS i
,CategoryId
等列调整您的用户界面PromotionId
。