0

任何人都可以帮忙吗?

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

    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

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

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

4

1 回答 1

2

想想你将如何在 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 是不可能的)。

于 2009-10-15T19:08:53.010 回答