繁体   English   中英

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

[英]LINQ: Using a pivot table in linq

有人可以帮忙吗?

我有以下使用关联的结构,如您所见,v.StructureType.Description的一对一关联效果很好,但是我需要在下面的示例中获取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

我有些困惑,非常感谢您的帮助。

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

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

一种替代方法是编写一个子查询,例如

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表使用DocTag的文档数很多。

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
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM