簡體   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