簡體   English   中英

這個LINQ查詢太長了嗎?

[英]Is this LINQ Query too long?

我是LINQ的新手,並且不想過度使用並且難以維護這些代碼。

你怎么看,這個LINQ查詢太長了?

IList<ListViewItem> data = runAnalysis.PassAnalyses.Cast<PassAnalysis>().
  Select(passAnalysis => passAnalysis.GetValue(PeakStatistics.PeakStatisticsProperty)).
  SelectMany(peakStatistics => peakStatistics.Statistics.
    Where(statisticsBase => statisticsBase.Name == statisticType).
    Select(statisticsBase => new ListViewItem {Content = statisticsBase})).ToList();

我會說它由於嵌套而變得復雜 - 但實際上並不需要。 這是一個查詢的例子,它會給出相同的結果(我認為),但更簡單......

IList<ListViewItem> data = runAnalysis.PassAnalyses
      .Cast<PassAnalysis>()
      .Select(pass => pass.GetValue(PeakStatistics.PeakStatisticsProperty))
      .SelectMany(peakStats => peakStats.Statistics)
      .Where(statisticsBase => statisticsBase.Name == statisticType)
      .Select(statisticsBase => new ListViewItem {Content = statisticsBase})
      .ToList();

沒有嵌套,很容易看出轉換是如何進行的:

  • 從PassAnalyses開始
  • 將每個項目轉換為PassAnalysis
  • 選擇PeakStatistics
  • 從每個元素中選擇其中的所有統計信息,並展平此序列
  • 使用錯誤的名稱過濾任何統計信息
  • 將每個結果轉換為ListViewItem
  • 將整個序列轉換為列表

此時,很容易將其轉換為查詢表達式:

IList<ListViewItem> data =
   (from PassAnalysis pass in runAnalysis.PassAnalyses
    from statsBase in pass.GetValue(PeakStatistics.PeakStatisticsProperty)
                          .Statistics
    where statsBase.Name == statisticType
    select new ListViewItem { Content = statsBase })
   .ToList();

請注意,我已經省略了第一個Select和SelectMany; 你可以使用let子句。 此外,我還為pass范圍變量使用了顯式類型,以使編譯器生成Cast<PassAnalysis >()調用。

這與原始版本略有不同,因為它將使用不同形式的SelectMany傳播原始pass值,但結果將是相同的。

最后調用ToList()有點難看,因為它沒有查詢表達式語法......但你可以使用一個中間變量:

var query = ...;
IList<ListViewItem> data = query.ToList();

IMO查詢很好,雖然它看起來有些密集。 您可以將其重新格式化以使其更加寬松:

var query = from analysis in runAnalysis.PassAnalyses.Cast<PassAnalysis>()
            let value = analysis.GetValue(PeakStatistics.PeakStatisticsProperty)
            from statistic in value.Statistics
            where statistic.Name == statisticType
            select new ListViewItem { Content = statistic };

IList<ListViewItem> data = query.ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM