2

ストアからデータを取得し、そこから DTO のコレクションを作成する Linq to Entities コードがいくつかあります...

  List<VRTSystemOverview> systems = query.OrderBy(s => s.DHRNumber)
    .Select(s => new VRTSystemOverview {
      ID = s.ID,
      SystemNumber = s.SystemNumber
      // other properties removed for clarity...
    })
    .ToList();

query は、現在のコンテキストに基づいて、いくつかのフィルタリングが適用された、列挙されていないクエリです。

ここで、パイプで区切られた文字列である新しいプロパティをこの DTO に追加したいと考えています。これは、元のシステム オブジェクトの子プロパティのコードで構成されています。これは、クライアントでのフィルタリングに使用されます。

ナビゲーションは次のように機能します。各システムには製品構成があり、各製品構成には多数の価格表エントリがあり、それぞれにコードがあります。したがって、私は次のことができるはずだと考えました...

  List<VRTSystemOverview> systems = vrtSystemsBasicQuery.OrderBy(s => s.DHRNumber)
    .Select(s => new VRTSystemOverview {
      ID = s.ID,
      SystemNumber = s.SystemNumber,
      PriceBookCodes = s.ProductConfiguration
        .ProductConfigurations_PriceBook
        .Select(pb => pb.PriceBook.ProductCode)
        .Aggregate("", (s1, a) => s1 += "|" + a)
    })
    .ToList();

ただし、Aggregate メソッドの 2 番目の「s1」は赤で下線が引かれ、コンパイラは「式ツリーには代入演算子が含まれていない可能性があります」というエラーを出します。

これが何を意味するのか、どのように回避するのかを説明できる人はいますか? 私はいくつかの検索を行いましたが、問題が何であるかを見つけることができません。式ツリーについて調べてみましたが、それが何であるかを実際に理解できませんでした。これが問題である可能性があります。

私はこのプロジェクトの他の場所でもまったく同じことをしましたが、それはメモリ内のコレクションで動作しており、Linq to Entities を使用したものではなく、違いがある可能性があります。

4

3 に答える 3

1

+=行上のは次の.Aggregate(ようなものです: s1 = s1 + "|". の値を実際に変更するつもりs1ですか? そうでない場合は、 を使用してs1 + "|" + aください。

于 2013-07-15T14:31:21.037 に答える
0

わかりました、まあ、これはできないようです。考えてみれば、SQL では Aggregate に相当するものを実行できないため、L2E はそれを変換できないため、理にかなっています。

SO に関する同様の質問、具体的には ( adriftから) 必要なデータを含む匿名型を作成し、クエリを列挙し、最後に (メモリ内コレクションを処理するとき)という提案でヘルプを見つけました。 、Linq To Objects を使用しているため) 集計を行います。

これは正しく機能しましたが、クエリの実行時間が 10 倍になりました。価格表コードをメイン DTO の子コレクションとして追加することにしました。これは高速かつ簡単で、クライアントでコレクションをフィルター処理しました。これにより、クライアントに送信されるデータがわずかに大きくなりますが、クエリの実行速度は遅くなります。

これが誰かに役立つことを願っています。答えてくれた人に感謝します。

于 2013-07-15T16:38:01.030 に答える