[英]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.