Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将列表与多个其他列表进行比较_C#_Asp.net_Sql_Sql Server_Compare - Fatal编程技术网

C# 将列表与多个其他列表进行比较

C# 将列表与多个其他列表进行比较,c#,asp.net,sql,sql-server,compare,C#,Asp.net,Sql,Sql Server,Compare,我一直没有找到解决这个问题的办法,部分原因是我不确定如何最好地解释这个问题!希望我在这里清楚,但如果不清楚,请随时询问更多信息 在最高一级: 在我们的数据库中,每个客户都可以拥有多个服务。服务分别分配给客户。但是,出于报告目的,我们需要将“组”服务放入公共服务组合的“包”中 我有一个包含包定义的数据库——一个名为packageServices的表,它只列出每个PackageID和一个关联的ServiceID。因此,我可以检索每个包的服务列表 从同一个数据库中,我可以检索特定客户的ServiceI

我一直没有找到解决这个问题的办法,部分原因是我不确定如何最好地解释这个问题!希望我在这里清楚,但如果不清楚,请随时询问更多信息

在最高一级: 在我们的数据库中,每个客户都可以拥有多个服务。服务分别分配给客户。但是,出于报告目的,我们需要将“组”服务放入公共服务组合的“包”中

我有一个包含包定义的数据库——一个名为packageServices的表,它只列出每个PackageID和一个关联的ServiceID。因此,我可以检索每个包的服务列表

从同一个数据库中,我可以检索特定客户的ServiceID列表

我试图完成的是比较为该客户检索的ServiceID列表,并查看该组合是否匹配任何已定义的包(即ServiceID的组合),如果匹配,则报告该客户拥有的包

就比较而言,我很难知道从哪里开始!我想我首先需要为每个包创建某种类型的ServiceID列表(而不是为每个包创建多行的当前KeyValuePairs(在字典中)),然后遍历包并将这些服务列表与客户拥有的服务列表进行比较

此处使用的数据类型可能不是最合适的—在许多情况下,我指的是“逻辑”列表,而不是C#list对象—我可以使用任何合适的数据类型:)

非常感谢任何帮助

编辑-有人建议我用SQL而不是C#应用程序来整理这些信息。这似乎是个好主意,下面的一个答案让我很接近。但是,有一些“业务规则”可以确定包是较低包的“升级”还是包本身,这会使事情严重复杂化

我越是努力使这项工作成功,我就越觉得自己吃得太多了!我正在尝试正确地设计它,以便将来对服务或包的任何更改都可以轻松处理-这些更改不太可能,但可能。然而,只需硬编码到目前为止我所看到的选项就会容易得多

编辑2-我一直在研究这个问题,有人建议我为每个包裹分配一个“重量”和一个“组”。分组的目的是确保客户只能从每组中获得一个包裹,权重的目的是确保只返回“最高”级别的包裹。将其与@Marcelocontos的查询结合使用将意味着我应该能够从每个组返回“最高”重量的包-这看起来可能符合应用程序的要求


感谢到目前为止所有帮助过我的人,我很惊讶回复的速度和质量。我来试一试,看看我的情况如何。

您可以计算客户的服务数量,然后,对于每个具有相同数量服务的套餐,计算与客户服务匹配的服务数量。只有精确匹配才会产生相同的计数

您可以在一个查询中完成此操作,尽管这是一个相当棘手的查询:

SELECT CustomerID, PackageID
  FROM (SELECT CustomerID, COUNT(*) AS qty
          FROM customerServices
         GROUP BY CustomerID
       ) cs
  JOIN (SELECT PackageID, COUNT(*) AS qty
          FROM packageServices
         GROUP BY PackageID
       ) ps ON cs.qty = ps.qty
 WHERE (SELECT COUNT(*)
          FROM customerServices cs2
          JOIN packageServices ps2 ON cs2.ServiceID = ps2.ServiceID
         WHERE cs2.CustomerID = cs.CustomerID
           AND ps2.PackageID = ps.PackageID
       ) = ps.qty
编辑:也许我误解了这个问题。如果要查找包含客户服务子集的包,可以改为:

 ...
       ) ps ON cs.qty >= ps.qty -- Change the test
 WHERE (SELECT COUNT(*)
          FROM customerServices cs2
          JOIN packageServices ps2 ON cs2.ServiceID = ps2.ServiceID
         WHERE cs2.CustomerID = cs.CustomerID
           AND ps2.PackageID = ps.PackageID
       ) = ps.qty

编辑2:我更改了第二种情况的逻辑,以利用以下事实:如果两个集合的交集与较小集合的大小相同,则较小集合是较大集合的子集。

我建议您不要尝试动态计算客户订阅的包(订阅可能不是正确的词,但你知道我的意思)。我建议您在数据库中保留单独的记录,指示客户订阅的包。每次客户添加新服务时,您都会使用一条消息指示已发生添加服务的事件,并通过使用现在已完成addi的任何包更新该客户的包来处理该事件对新产品的描述。

他必须为每个包含@Marcelo Cantos的软件包这样做-非常感谢-尽管我解释得很糟糕,但我认为你已经很好地理解了这个问题!你说得很对,客户可以获得额外的服务,而不是软件包的一部分。让我详细考虑你的解决方案,并在后面报告,但要详细说明SQL很有道理。@JimmE:NP.BTW,我改变了逻辑。我意识到在测试子集时,您仍然可以使用集合计数方法,从而避免双重不存在的混乱。@Bond:谢谢您指出这一点。我已经修改了答案。@KirkBroadhurst:我不确定您的意思是什么(或者我最近的修正案是否针对您的意见)。我已经用样本数据集测试了这两个版本,它们工作正常,但可能我遗漏了一些东西。我们谈论的服务、包、每个服务的典型包等的大小是什么?@AakashM-很好。服务和包总是相对较小的-目前7个服务排列成8个包-这s将增加,但不会显著增加。到目前为止,每个包的最大服务数量为6。客户数量将增加到数千。但是,这些“计算”每月只需执行一次。这是一项“一次性”工作,以确定每个客户都有哪些包,还是每次有人访问网站时,你都需要这样做正如Dave在下文中建议的那样,更合理的做法是将数据存储在数据库中—今天计算一次,然后确保数据已更新,您再也不用计算了。@KirkBroadhurst—基本上每月只需执行一次—我们将检索所有客户的列表