0

linq to Sql で Aggregate Method を使用しようとしていましたが、サポートされていないようです。

LibrarySystemDataContext ctx = new LibrarySystemDataContext();

var query = ctx.Books
  .Select(x => new
      {
        BookID = x.BookID,
          BookName = x.Title,
          Authors = x.AuthorBooks.Select(a => a.Author)
          .Aggregate(new StringBuilder(), (sb, r) => sb.Append(r.FirstName + " " + r.LastName +"& "), sb => sb.ToString())
          });

Aggregate を使用するために、次のようにすぐに本を IEnumerable に変換しました。

var query = ctx.Books.AsEnumerable()
  .Select(x => new
      {
        BookID = x.BookID,
          BookName = x.Title,
          Authors = x.AuthorBooks.Select(a => a.Author)
          .Aggregate(new StringBuilder(), (sb, r) => sb.Append(r.FirstName + " " + r.LastName +"& "), sb => sb.ToString())
          });

そして、これは機能しています。このようなクエリを書いた場合、どのような欠点や設計上の欠陥があるかを知りたいです。

4

1 に答える 1

1

データベースから book テーブル全体をctx.Books.AsEnumerable()選択し、メモリ内で処理を開始します。これは良い設計ではありません。あなたがすべきことは、必要なデータを選択してからローカルで処理することです。

例えば

var temp = ctx.Books
  // probably some where clause
  .Select(x => new
      {
        BookID = x.BookID,
          BookName = x.Title,
          Authors = x.AuthorBooks.Select(a => a.Author)
          })
  .ToArray();

var books = temp.Select(x => new { 
    x.BookID, 
    x.BookName, 
    Authors = x.Authors.Aggregate(new StringBuilder(), (sb, r) => sb.Append(r.FirstName + " " + r.LastName +"& "), sb => sb.ToString()) 
});
于 2013-06-08T12:29:29.393 に答える