LINQ:在linq中使用数据透视表

时间:2009-10-15 12:53:14

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

有人可以帮忙吗?

我有以下结构使用关联,正如你所看到的v.StructureType.Description非常适合作为1对1的关联,但我需要在我的例子中得到v.StructureGroup.StructureGroupTariffs.Tariff.Price但是StructureGroupTariffs是一个链接StructureGroup和Tariffs的Pivot表,因此它是一个多对多,所以它返回一个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

我有点困惑,真的很感激一些帮助。

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

1 个答案:

答案 0 :(得分: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。

以下是内部联接的示例(通过Doc_DocTag表,从我的模式中简化,其中Docs通过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)。