2011-08-02 35 views
2

有了LINQ,如何做select並只返回第一個關聯的子項?LINQ,只選擇子項的第一個元素

我:

[table: Report] 
    GeneratedDate 
    PerformanceMetric 1 -----> N [table PerformanceMetric] 
    Bios        Timestamp 
    ...        X 
             Y 
             ..... (there is a good dozen other fields) 

目前,我做的:

Report = _ctx.Reports.SingleorDefault(rpt => rpt.bios == mySerial); 

這將返回與所有PerformanceMetric相關的報告。我想只返回PerformanceMetric的第一個匹配項。

LINQ是否提供了這樣做的內置方法?

編輯:其實,我正在尋找報告,但PerformanceMetric應該只包含第一個元素。 (Report.PerformanceMetrics.Count < = 1) sry不清楚..

+0

所以你確實有正確的實現一直?或者你想要報告,但「PerformanceMetric」應該只包含第一個元素? –

+0

是包含Report.PerformanceMetrics的報告僅包含1或0個元素。可能會有1000個與數據庫中的報告相關聯的PerformanceMetric記錄... – Apoulet

+0

好吧,讓我直接得到它,您想要報告,但您希望修改報告以便PerformanceMetric僅包含0/1元素? –

回答

3

很難說正是基於你的XML完整的結構,但這樣的:

var firstMetric = _ctx.Reports 
    .Where(rpt => rpt.bios == mySerial) 
    .Select(rpt => rpt.PerformanceMetrics) // assuming name here... 
    .FirstOrDefault(); 

這將返回該報告的第一性能度量匹配mySerial,或默認(空的類),如果where子句沒有找到任何報告或沒有性能指標存在。

更新:根據問題中的更新,您希望有所不同。你需要這份報告,但只有一個性能指標。這涉及改變原始報告(不確定所有成員),因爲您不想在LINQ中操縱原始數據,所以可能有點兒毛病。

所以,你有兩個選擇:

  1. 您可以創建報告的一個新實例,並複製所有的屬性,只是一個指標。
  2. 您可以使用報告和屬性一起創建一個匿名類型。

我可能更喜歡#2,因爲返回修改後的報告可能會讓人困惑。所以,你可以這樣做:

var firstMetric = _ctx.Reports 
    .Where(rpt => rpt.bios == mySerial) 
    .Select(new { Report = rpt, Metric = rpt.PerformanceMetrics.FirstOrDefault() }) 
    .FirstOrDefault(); 

這將掃描的一個地方BIOS == mySerial,創建一個新的匿名類型與報告員==到原始報表的報告,以及度量成員==第一度量標準在報告列表中。

如果不存在度量標準但存在報告,則會得到一個匿名類型,其中Report =您的報告和Metric = null。如果沒有報告存在匹配條件,則返回null。

如果你真的想要#1,你可以這樣做:

var firstMetric = _ctx.Reports 
    .Where(rpt => rpt.bios == mySerial) 
    .Select(new Report 
     { 
      PerformanceMetrics = rpt.PerformanceMetrics.Take(1), 
      // copy all other Report fields here... 
     }) 
    .FirstOrDefault(); 
+1

只是一個關於反對票的建議,如果你打算投票,很高興能夠包括一個評論,以便作者能夠了解問題所在。 –

+0

一個好的,簡潔的答案。 –

2

你在找這樣的嗎?

var reportMetric = (from r in _ctx.Reports select r.PerformanceMetric where r.Bios == mySerial).FirstOrDefault(); 
+0

打敗我吧:-) –

相關問題