【问题标题】:LINQ: Using a pivot table in linqLINQ:在 linq 中使用数据透视表
【发布时间】:2010-12-07 00:42:01
【问题描述】:

谁能帮忙?

我有以下使用关联的结构,如您所见,v.StructureType.Description 作为 1 对 1 关联非常有效,但我需要在下面的示例中获取 v.StructureGroup.StructureGroupTariffs.Tariff.Price 但是StructureGroupTariffs 是一个数据透视表,用于将 StructureGroup 和 Tariffs 相互链接,因此它是多对多的,因此它返回一个 EntitySet,我现在了解这个问题,但我不确定如何解决它

    from v in Houses
       select new 
       {
          Id = v.Id,
          Color = v.Color.Description,
          StructureType= v.StructureType.Description,
          Price = v.StructureGroup.StructureGroupTariffs. // Tariff.Price doesn't appear because its MANY to ONE
       }

所以了解我的 structureGroupTariffs 是我的支点(链接表),我必须传入

                 IdTariff  and  StructureGroupId

然后这给了我 1 比 1...所以我想我可以使用 StructureGroupTariffs.Tariff.Price ???因为这将在 StructureGroup 和 Tariff 之间返回 1 比 1

我有点困惑,非常感谢一些帮助。

我现在了解这个问题,但不确定如何解决。

【问题讨论】:

    标签: c# linq linq-to-sql associations inner-join


    【解决方案1】:

    想想你将如何在 SQL 中解决这种查询,我认为你可以应用这种推理。编写这种连接有两种主要方法:第一种是使用从主表到连接表的内部连接,然后再到结果表,并使用适当的过滤器。如果您不小心正确过滤连接,您​​将在每个主表中获得多行(这实际上就是您获得 EntitySet 的原因。如果您使用 .FirstOrDefault() 针对该实体集,您将获得您正在寻找的实体(假设您已过滤到单个结果:如果没有,您将得到一些随机结果。

    另一种方法是编写子查询,例如

    Price = (from t in v.StructureGroup.StructureGroupTariffs.Tariffs 
    where t.StructionGroupID = v.StructureGroupID 
    and t.IdTariff = *not sure where this filter comes from*
    select t.Price).First()
    

    上面缺少的过滤器同样是第一种方法的问题:无论哪种方式,您都需要唯一标识您想要的 t.Price。

    这是一个内部连接的示例(从我的模式中简化,其中 Docs 是多对多的,通过 Doc_DocTag 表使用 DocTags。

    from d in Docs 
    join ddt in Doc_DocTags on d.DocGuid equals ddt.DocGuid
    join dt in DocTags on ddt.DocTagID equals dt.DocTagID
    select new {
        d.DocName, dt.DocTagName
    }
    

    如果我只想要一个标签:

    from d in Docs 
    join ddt in Doc_DocTags on d.DocGuid equals ddt.DocGuid
    join dt in DocTags on ddt.DocTagID equals dt.DocTagID
    where dt.DocTagName == "Target"
    select new {
        d.DocName, dt.DocTagName
    }
    

    这将只找到带有 Target 标签的文档(这将进一步确保多个 DocTag 是不可能的)。

    【讨论】:

    • 谢谢!!我已经注意到了 innerjoin 方式,但我也测试了这个 Price = v.StructureGroup.StructureGroupTariffs.FirstDefault()。现在我可以看到所有的细节——当然正如你所说的那样,它是随机的。我如何过滤它..我是否使用 All(和一些 lambda??).. 基本上正确过滤它我需要(以某种方式)将 IdTariff 和 StructureGroupId 传递给作为数据透视表的 StructureGroupTariffs 表。 IE。如果我传入 idtariff=10 和 StructureGroup = 5,我只会得到 1 条记录...我非常感谢您在这里拥有的任何 cmets,因为它看起来可以工作
    • 我们在哪里学习正确的 IdTarrif?如果它在 v(基表)中,那么子查询的缺失部分就是 t.IdTariff = v.IdTariff。在您的原始查询中,最好通过相同性质的连接来获得。如果你能提供这些信息,我可以举个例子。
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2023-04-04
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多