0

これが私がやろうとしていることです: 私の ASP.NET Web API は、チャートの「id」、「startTimestamp」、および「endTimestamp」をクライアントから受け入れます。startTimestamp と endTimestamp で定義されたタイムスタンプ範囲内にある "MeasureData" (添付の EF5 概念モデル図を参照) のみを選択するには、Web API が必要です。私の Web API は、JSON AmSerialChart オブジェクト グラフをクライアントに返します。次に、JSON オブジェクト グラフを解析し、amCharts Javascript API を使用してグラフを作成します。グラフには、startTimestamp と endTimestamp の間のデータのみが表示されます。

コントローラーで、MeasureData をフィルター処理し、フィルター処理された MeasureData を含む AmSerialChart オブジェクトを返す LINQ 式を記述する方法がわかりません。

失敗した試みの 1 つを次に示します。

AmSerialChart amserialchart =
(AmSerialChart)db.AmSerialCharts
.Find(id)
.Graphs
.Select(g => g.Measure)
.SelectMany(m => m.MeasureData)
.Where(md => md.Timestamp >= startDate && md.Timestamp <= endDate);

「db.AmSerialCharts.Find(id)」は適切なチャート エンティティを見つけますが、オブジェクト グラフの残りの部分をナビゲートして MeasureData フィルターに到達する方法がわかりません。

4

2 に答える 2

1

場合によっては、単一行の LINQ が問題の最適な解決策ではないことがあります。たとえそれが可能であったとしても、可読性は窓の外に出てしまうことがよくあります。手動で作業を行うのが最善の場合もあります。

リクエストの問題はAmSerialChart、時間枠に合わせて完全なオブジェクト階層が削除されたオブジェクトが必要なことです。問題は、基本Selectがそれをしないということです。新しいリストまたは新しいオブジェクトを生成する必要があります。

あなたの最善の解決策は、LINQ を試みるのではなく、オブジェクト階層を「コピー」することだと思います。

var fullChart = charts.Where(c => c.Id == id).Single();
var result = new AmSerialChart()
{
  Id = fullChart.Id,
  Name = fullChart.Name,
  Description = fullChart.Description,
  FirstTimestamp = fullChart.FirstTimestamp,
  LastTimestamp = fullChart.LastTimestamp,
  Graphs = new List<Graph>()
};

foreach (var graph in fullChart.Graphs)
{
  var measure = graph.Measure;

  var newMeasure = new Measure()
  {
    Id = measure.Id,
    // Copy the rest of data

    MeasureData = new List<MeasureData>()
  };

  foreach (var measureData in measure.MeasureData)
  {
    if (measureData.Timestamp >= startDate && measureData.Timestamp <= endDate)
    {
      var newMeasureData = new MeasureData()
      {
        Id = measureData.Id,
        // Copy the rest of data
      };
      newMeasure.MeasureData.Add(newMeasureData);
    }
  }

  if (newMeasure.MeasureData.Count() > 0)
  {
    var newGraph = new Graph()
    {
      Id = graph.Id,
      // Copy the rest of data

      Measure = newMeasure
    };
    result.Graphs.Add(newGraph);
  }
}
于 2013-06-05T18:30:29.723 に答える